рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ

рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ
рдпрд╣ рдЖрд▓реЗрдЦ рдпреВрдирд┐рдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдХреБрдЫ рд╣рдж рддрдХ рдирд┐рд░рд╛рд╢ рдерд╛ рдХрд┐ рдПрдХ рд╣рд╛рд▓рд┐рдпрд╛ рд▓реЗрдЦ рдЬрд┐рд╕рдХрд╛ рд╢реАрд░реНрд╖рдХ рдерд╛ "рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ?" рдирд┐рдХрд▓рд╛ рдирд╣реАрдВ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реЛ рдЧрдпрд╛ рдФрд░ рдЙрддреНрддрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд░рд╛рдиреЗ рд╕реНрд░реЛрддреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рд▓рдЧрд╛ред

рд╣рдо рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЗрдВ "рд╢рд╛рдпрдж рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╡рд┐рд╖реНрдХрд╛рд░" рд╣реИрдВ - рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдХреЗ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рджрд░реНрд╢рди рдХреА рдПрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛, рдФрд░ рдкрд░рд┐рдЪрд┐рдд рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдирд╛рд░рд╛:

$ echo hello | wc -c
6

рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрддреНрдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ pipe, рдЬрд┐рд╕рдХрд╛ рд╡рд░реНрдгрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкреГрд╖реНрдареЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдкрд╛рдЗрдк(7) ╨╕ рдкрд╛рдЗрдк(2):

рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЗрдВ рдЕрдВрддрд░-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ-рддрд░рдлрд╝рд╛ рдЪреИрдирд▓ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ (рд░рд╛рдЗрдЯ рдПрдВрдб) рдФрд░ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ (рд░реАрдб рдПрдВрдб) рд╣реЛрддрд╛ рд╣реИред рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреЙрд▓ рдХрд░рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ pipe(2), рдЬреЛ рджреЛ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ: рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛред

рдЙрдкрд░реЛрдХреНрдд рдХрдорд╛рдВрдб рд╕реЗ рдЯреНрд░реЗрд╕ рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЙрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:

$ strace -qf -e execve,pipe,dup2,read,write 
    sh -c 'echo hello | wc -c'

execve("/bin/sh", ["sh", "-c", "echo hello | wc -c"], тАж)
pipe([3, 4])                            = 0
[pid 2604795] dup2(4, 1)                = 1
[pid 2604795] write(1, "hellon", 6)    = 6
[pid 2604796] dup2(3, 0)                = 0
[pid 2604796] execve("/usr/bin/wc", ["wc", "-c"], тАж)
[pid 2604796] read(0, "hellon", 16384) = 6
[pid 2604796] write(1, "6n", 2)        = 2

рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ pipe()рд╕рдВрд▓рдЧреНрди рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдПрдХ рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ рдПрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рдкреНрд░реЛрд╕реЗрд╕ рджреВрд╕рд░реЗ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд╕реЗ рд╡рд╣реА рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИред рд╢реЗрд▓ stdin рдФрд░ stdout рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП dup2 рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ 3 рдФрд░ 4 рдХрд╛ "рдирд╛рдо" рдмрджрд▓рддрд╛ рд╣реИред

рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛, рд╢реЗрд▓ рдХреЛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдЕрдзрд┐рдХ рд╕рдВрд╕рд╛рдзрди рдФрд░ рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рдмрд░реНрдмрд╛рдж рдХрд░реЗрдВрдЧреЗред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЗрдВ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рд╣реИрдВ:

рдпрджрд┐ рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рдЦрд╛рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдкрдврд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреА рд╣реИ, рддреЛ read(2) рдбреЗрдЯрд╛ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рддрдХ рдмреНрд▓реЙрдХ рд░рд╣реЗрдЧрд╛. рдпрджрд┐ рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реНрдг рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреА рд╣реИ, рддреЛ write(2) рд▓реЗрдЦрди рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рддрдХ рдмреНрд▓реЙрдХ рд░рд╣реЗрдЧрд╛ред

POSIX рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рддрд░рд╣, рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреБрдг рд╣реИ: рдкрд╛рдЗрдкрд▓рд╛рдЗрди рддрдХ рд▓рд┐рдЦрдирд╛ PIPE_BUF рдмрд╛рдЗрдЯреНрд╕ (рдХрдо рд╕реЗ рдХрдо 512) рдкрд░рдорд╛рдгреБ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрдЪрд╛рд░ рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдлрд╛рдЗрд▓реЗрдВ (рдЬреЛ рдРрд╕реА рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ) рдирд╣реАрдВ рдХрд░ рд╕рдХрддреАрдВред

рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде, рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкрдиреЗ рд╕рднреА рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЗрд╕рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднреЗрдЬ рд╕рдХрддреА рд╣реИред рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдкрдврд╝рдиреЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рддрдВрддреНрд░ (рдЬреИрд╕реЗ рд╕реЗрдорд╛рдлреЛрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрдард┐рди рд╕рдорд╛рдирд╛рдВрддрд░ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдХрдиреНрд╡реЗрдпрд░ рд╣рдореЗрдВ рдЗрд╕ рд╕рд╛рд░реА рдкрд░реЗрд╢рд╛рдиреА рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВред

рд╣рдо рдХреНрдпрд╛ рдЦреЛрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдореИрдВ рдЕрдкрдиреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдП рдХрд┐ рдПрдХ рдХрдиреНрд╡реЗрдпрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдмрдлрд╝рд░ рдФрд░ рдХреБрдЫ рд╕реНрдерд┐рддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдкрдХреЛ рдмрдлрд╝рд░ рд╕реЗ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкрд░ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рд╢реЗрд╖ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдЕрд╕реНрдкрд╖реНрдЯ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдХреА рдкреБрд╖реНрдЯрд┐ рдпрд╛ рдЦрдВрдбрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЬреНрдЬреНрд╡рд▓ рд▓реИрдВрдкрд▓рд╛рдЗрдЯ рдХреЗ рддрд╣рдд рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рддреИрдпрд╛рд░ рд░рд╣реЗрдВред

рд╣рдо рдХрд╣рд╛рдБ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ?

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдкреНрд░рд╕рд┐рджреНрдз рдкреБрд╕реНрддрдХ рдХреА рдореЗрд░реА рдкреНрд░рддрд┐ рдХрд╣рд╛рдБ рд╣реИредрд╕рд┐рдВрд╣ рдкреБрд╕реНрддрдХ┬л рдпреВрдирд┐рдХреНрд╕ 6 рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рдзрдиреНрдпрд╡рд╛рдж рдпреВрдирд┐рдХреНрд╕ рд╣реЗрд░рд┐рдЯреЗрдЬ рд╕реЛрд╕рд╛рдпрдЯреА рдСрдирд▓рд╛рдЗрди рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╕реЛрд░реНрд╕ рдХреЛрдб рдпреВрдирд┐рдХреНрд╕ рдХреЗ рднреА рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгред

рдЯреАрдпреВрдПрдЪрдПрд╕ рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдореЗрдВ рдШреВрдордирд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп рдореЗрдВ рдЬрд╛рдиреЗ рдЬреИрд╕рд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рд╕рд╛рдЭрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдкреБрд░рд╛рдиреЗ рдХреИрд╕реЗрдЯ рдФрд░ рдкреНрд░рд┐рдВрдЯрдЖрдЙрдЯ рд╕реЗ рдереЛрдбрд╝рд╛-рдереЛрдбрд╝рд╛ рдХрд░рдХреЗ рдЗрд╕ рд╕рд╛рд░реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдореИрдВ рдЙрди рдЯреБрдХрдбрд╝реЛрдВ рд╕реЗ рднрд▓реАрднрд╛рдВрддрд┐ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ рдЬреЛ рдЕрднреА рднреА рдЧрд╛рдпрдм рд╣реИрдВред

рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдкреНрд░рд╛рдЪреАрди рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдзреБрдирд┐рдХ рдХреЛрд░ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдВрдпреЛрдЧ рд╕реЗ, pipe рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ 42 рд╣реИ sysent[]. рд╕рдВрдпреЛрдЧ?

рдкрд╛рд░рдВрдкрд░рд┐рдХ рдпреВрдирд┐рдХреНрд╕ рдХрд░реНрдиреЗрд▓ (1970-1974)

рдореБрдЭреЗ рдХреЛрдИ рдирд┐рд╢рд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ pipe(2) рди рддреЛ рдореЗрдВ рдкреАрдбреАрдкреА-7 рдпреВрдирд┐рдХреНрд╕ (рдЬрдирд╡рд░реА 1970), рди рд╣реА рдореЗрдВ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдпреВрдирд┐рдХреНрд╕ (рдирд╡рдВрдмрд░ 1971), рди рд╣реА рдЕрдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг (рдЬреВрди 1972)ред

рдЯреАрдпреВрдПрдЪрдПрд╕ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ рддреАрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдпреВрдирд┐рдХреНрд╕ (рдлрд░рд╡рд░реА 1973) рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдерд╛:

рдпреВрдирд┐рдХреНрд╕ рдХрд╛ рддреАрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд░реНрдиреЗрд▓ рд╡рд╛рд▓рд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдерд╛, рд▓реЗрдХрд┐рди рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рднреА рдерд╛ред 1973 рдХреЗ рджреМрд░рд╛рди, рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдЪрд▓ рд░рд╣рд╛ рдерд╛, рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕реА рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕ рддрд░рд╣ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рдЪреМрдереЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖред

рдПрдХ рдкрд╛рдардХ рдХреЛ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╕реНрдХреИрди рдорд┐рд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рдбреМрдЧ рдореИрдХрд▓рд░реЙрдп рдиреЗ "рдмрдЧреАрдЪреЗ рдХреА рдирд▓реА рдХреА рддрд░рд╣ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ" рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред

рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ
рдмреНрд░рд╛рдпрди рдХрд░реНрдирд┐рдШрди рдХреА рдХрд┐рддрд╛рдм рдореЗрдВрдпреВрдирд┐рдХреНрд╕: рдПрдХ рдЗрддрд┐рд╣рд╛рд╕ рдФрд░ рдПрдХ рд╕рдВрд╕реНрдорд░рдгтАЭ, рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ, рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: тАЬтАж рдпрд╣ 30 рд╡рд░реНрд╖реЛрдВ рддрдХ рдмреЗрд▓ рд▓реИрдмреНрд╕ рдореЗрдВ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рджреАрд╡рд╛рд░ рдкрд░ рд▓рдЯрдХрд╛ рд░рд╣рд╛редтАЭ рдпрд╣рд╛рдБ рдореИрдХрд┐рд▓реЙрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░рдФрд░ рджреВрд╕рд░реА рдХрд╣рд╛рдиреА рд╕реЗ рдореИрдХрд┐рд▓реЙрдп рдХрд╛ рдХрд╛рдо, 2014 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛:

рдЬрдм рдпреВрдирд┐рдХреНрд╕ рд╕рд╛рдордиреЗ рдЖрдпрд╛, рддреЛ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдкреНрд░рддрд┐ рдореЗрд░реЗ рдЬреБрдиреВрди рдиреЗ рдореБрдЭреЗ рдУрдПрд╕ рд▓реЗрдЦрдХ, рдХреЗрди рдереЙрдореНрдкрд╕рди рд╕реЗ рдХреБрдЫ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рди рдХреЗрд╡рд▓ рдбрд┐рд╡рд╛рдЗрд╕ рддрдХ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреАред рдХреЗрди рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдиреНрдпреВрдирддрдорд╡рд╛рджреА рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╣ рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд╕реНрдЯрдо рд╕реБрд╡рд┐рдзрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдПред рдХреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕реАрдзрд╛ рд▓реЗрдЦрди рдХрд┐рд╕реА рдордзреНрдпрд╡рд░реНрддреА рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реИ? рдФрд░ рдХреЗрд╡рд▓ рдЬрдм рдореИрдВрдиреЗ рдЖрдХрд░реНрд╖рдХ рдирд╛рдо "рдкрд╛рдЗрдкрд▓рд╛рдЗрди" рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛, рддреЛ рдХреЗрди рдиреЗ рдЕрдВрддрддрдГ рдХрд╣рд╛: "рдореИрдВ рдпрд╣ рдХрд░реВрдВрдЧрд╛!"ред

рдФрд░ рдХрд┐рдпрд╛ред рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╢рд╛рдо, рдХреЗрди рдиреЗ рдХрд░реНрдиреЗрд▓ рдФрд░ рд╢реЗрд▓ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рдЗрдирдкреБрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рдирдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдп рдХрд┐рдП (рдЬреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдЖ рд╕рдХрддреЗ рд╣реИрдВ), рдФрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдмрджрд▓ рджрд┐рдПред рдЕрдЧрд▓реЗ рджрд┐рди, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд▓рдЧрд╛ред рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рддрдХ, рд╕рдЪрд┐рд╡реЛрдВ рдиреЗ рд╡рд░реНрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рдкреНрд░рд┐рдВрдЯрд░ рддрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдХреЗрди рдиреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХреНрд▓реАрдирд░ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдПрдкреАрдЖрдИ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬреЛ рддрдм рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдпреВрдирд┐рдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдЦреЛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдб C рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реБрдЖ рд╣реИ рдЪреМрдерд╛ рд╕рдВрд╕реНрдХрд░рдг, рдЬрд┐рд╕реЗ рдирд╡рдВрдмрд░ 1973 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рд▓реАрдЬ рд╕реЗ рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕рд┐рджреНрдз рдпреВрдирд┐рдХреНрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╢рд╛рдпрдж рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдЦреЛ рдЧрдпрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд╛рда рд╣реИ pipe(2) рджреЛрдиреЛрдВ рд░рд┐рд▓реАрдЬрд╝реЛрдВ рд╕реЗ, рдЗрд╕рд▓рд┐рдП рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЦреЛрдЬрдХрд░ рд╢реБрд░реБрдЖрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреАрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг (рдХреБрдЫ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП, "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" рд░реЗрдЦрд╛рдВрдХрд┐рдд, ^H рдЕрдХреНрд╖рд░ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдПрдХ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╣реЛрддрд╛ рд╣реИ!)ред рдпрд╣ рдЖрджреНрдп-pipe(2) рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкреЗрдХреНрд╖рд┐рдд рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд╛рдЗрдк рдПрдХ I/O рддрдВрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реМрдЯрд╛рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ 504 рдмрд╛рдЗрдЯреНрд╕ рдбреЗрдЯрд╛ рддрдХ рдмрдлрд╝рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд▓рдВрдмрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдкрдврд╝рддреЗ рд╕рдордп, рдмрдлрд╝рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЧрд▓реЗ рд╡рд░реНрд╖ рддрдХ, рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕реА рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдкрд╛рдЗрдк(2) рдЪреМрдерд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдЖрдзреБрдирд┐рдХ рд╕реНрд╡рд░реВрдк рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ "pipe(fildes)┬╗:

рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд╛рдЗрдк рдПрдХ I/O рддрдВрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реМрдЯрд╛рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ r1 (resp. fildes[1]) рдореЗрдВ рд▓реМрдЯрд╛рдП рдЧрдП рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, 4096 рдмрд╛рдЗрдЯреНрд╕ рдбреЗрдЯрд╛ рддрдХ рдмрдлрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджреА рдЬрд╛рддреА рд╣реИред рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдкрдврд╝рддреЗ рд╕рдордп, рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ r0 (resp. fildes[0]) рдкрд░ рд▓реМрдЯ рдЖрддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рд▓реЗрддрд╛ рд╣реИред

рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рджреЛ (рдпрд╛ рдЕрдзрд┐рдХ) рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ (рдмрд╛рдж рдХреЗ рдЖрдордВрддреНрд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд) рд╣реЛрддреА рд╣реИрдВ рдХрд╛рдВрдЯрд╛) рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ рдкрдврд╝рдирд╛ ╨╕ рд▓рд┐рдЦрдирд╛.

рд╢реЗрд▓ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд░реИрдЦрд┐рдХ рд╕рд░рдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрддрд╛ рд╣реИред

рдПрдХ рдЦрд╛рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди (рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдмрдлрд╝рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ) рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдЬрд┐рд╕рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рд┐рд░рд╛ рд╣реИ (рд╕рднреА рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмрдВрдж рд╣реИрдВ) "рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрдд" рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рд╛рдЗрдЯ рдХреЙрд▓ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рд╕рдВрд░рдХреНрд╖рд┐рдд рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рдкрд╛рдВрдЪрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП (рдЬреВрди 1974), рд▓реЗрдХрд┐рди рдпрд╣ рд▓рдЧрднрдЧ рдЙрд╕реА рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдХреЗрд╡рд▓ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реА рдЧрдИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд╛рдБрдЪрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпреВрдирд┐рдХреНрд╕ рдЫрдард╛ рд╕рдВрд╕реНрдХрд░рдг (1975)

рдпреВрдирд┐рдХреНрд╕ рд╕реНрд░реЛрдд рдХреЛрдб рдкрдврд╝рдирд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ рдЫрдард╛ рд╕рдВрд╕реНрдХрд░рдг (рдордИ 1975) рдХреЛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рд▓рд╛рдпрдВрд╕ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рдвреВрдВрдврдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:

рдХрдИ рд╕рд╛рд▓реЛрдВ рддрдХ рдХрд┐рддрд╛рдм рд▓рд╛рдпрдВрд╕ рдмреЗрд▓ рд▓реИрдмреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдЙрдкрд▓рдмреНрдз рдпреВрдирд┐рдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдкрд░ рдПрдХрдорд╛рддреНрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдиреЗ рд╢рд┐рдХреНрд╖рдХреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдереА, рд╕рд╛рддрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдиреЗ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рджрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдкреБрд╕реНрддрдХ рдХреЛ рдЕрд╡реИрдз рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдкреНрд░рддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЖрдЬ рдЖрдк рдкреБрд╕реНрддрдХ рдХреА рдкреБрдирд░реНрдореБрджреНрд░рд┐рдд рдкреНрд░рддрд┐ рдЦрд░реАрдж рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдХрд╡рд░ рдкрд░ рдХрд╛рдкрд┐рдпрд░ рдкрд░ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рд╡реЙрд░реЗрди рдЯреВрдореА (рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЯреАрдпреВрдПрдЪрдПрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХреА) рдХреЛ рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЫрдард╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрд░реЛрдд рдкреАрдбреАрдПрдл. рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдЕрдВрджрд╛рдЬрд╝рд╛ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд┐рддрдирд╛ рдкреНрд░рдпрд╛рд╕ рд╣реБрдЖ:

15 рд╡рд░реНрд╖ рд╕реЗ рднреА рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рджрд┐рдП рдЧрдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдПрдХ рдкреНрд░рддрд┐ рдЯрд╛рдЗрдк рдХреА рдереА рд▓рд╛рдпрдВрд╕рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдиреНрдп рдкреНрд░рддрд┐рдпреЛрдВ рд╕реЗ рдЕрдкрдиреА рдкреНрд░рддрд┐ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдИред рдЯреАрдпреВрдПрдЪрдПрд╕ рдЕрднреА рддрдХ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдирд╣реАрдВ рдерд╛, рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдкреБрд░рд╛рдиреЗ рд╕реНрд░реЛрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рдереАред рд▓реЗрдХрд┐рди 1988 рдореЗрдВ рдореБрдЭреЗ 9 рдЯреНрд░реИрдХ рд╡рд╛рд▓рд╛ рдПрдХ рдкреБрд░рд╛рдирд╛ рдЯреЗрдк рдорд┐рд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рдкреАрдбреАрдкреА11 рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдмреИрдХрдЕрдк рдерд╛ред рдпрд╣ рдЬрд╛рдирдирд╛ рдХрдард┐рди рдерд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдХреНрд╖реБрдгреНрдг /usr/src/ рдкреЗрдбрд╝ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ 1979 рдЕрдВрдХрд┐рдд рдерд╛, рдЬреЛ рддрдм рднреА рдкреНрд░рд╛рдЪреАрди рджрд┐рдЦрддрд╛ рдерд╛ред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдпрд╣ рд╕рд╛рддрд╡рд╛рдВ рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдкреАрдбрдмреНрд▓реВрдмреА рд╡реНрдпреБрддреНрдкрдиреНрди рдерд╛ред

рдореИрдВрдиреЗ рдЦреЛрдЬ рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдФрд░ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ред рдХреЛрдб рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╣реА рд░рд╣рд╛, рдХреБрдЫ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЖрдзреБрдирд┐рдХ рдЯреЛрдХрди += рдХреЛ рдЕрдкреНрд░рдЪрд▓рд┐рдд =+ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдХреБрдЫ рдХреЛ рдмрд╕ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХреБрдЫ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВред

рдФрд░ рдЖрдЬ рд╣рдо рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдЯреАрдпреВрдПрдЪрдПрд╕ рдкрд░ рдСрдирд▓рд╛рдЗрди рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдкреБрд░рд╛рд▓реЗрдЦ, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдирд┐рд╕ рд░рд┐рдЪреА рдХрд╛ рд╣рд╛рде рдерд╛.

рд╡реИрд╕реЗ, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдХрд░реНрдирд┐рдШрди рдФрд░ рд░рд┐рдЪреА рдХреЗ рдХрд╛рд▓ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕реА-рдХреЛрдб рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрд╕рдХреА рд╣реИ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛. рдРрд╕рд╛ рдЕрдХреНрд╕рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдкрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рдВрдХреАрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдХреНрд╖реЗрддреНрд░ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рд╕рдВрдкрд╛рджрди рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдХреЗ рд╕реНрдирд┐рдкреЗрдЯ рдбрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред

рд╢реАрдШреНрд░ /usr/sys/ken/pipe.c рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгреА рд╣реИ (рдФрд░ рд╣рд╛рдБ, рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИ /usr/sys/dmr):

/*
 * Max allowable buffering per pipe.
 * This is also the max size of the
 * file created to implement the pipe.
 * If this size is bigger than 4096,
 * pipes will be implemented in LARG
 * files, which is probably not good.
 */
#define    PIPSIZ    4096

рдЪреМрдереЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рд╕реЗ рдмрдлрд╝рд░ рдХрд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ, рдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЗрдВ рдПрдХ рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдлрд╝реЙрд▓рдмреИрдХ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рдереАрдВ!

рдЬрд╣рд╛рдБ рддрдХ LARG рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкреНрд░рд╢реНрди рд╣реИ, рд╡реЗ рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ рдЗрдиреЛрдб-рдзреНрд╡рдЬ LARG, рдЬрд┐рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдмрдбрд╝реЗ рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо" рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдмреНрд▓реЙрдХ рдмрдбрд╝реЗ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЪреВрдВрдХрд┐ рдХреЗрди рдиреЗ рдХрд╣рд╛ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдирд╛ рд╣реА рдмреЗрд╣рддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдирдХреА рдмрд╛рдд рдорд╛рдирдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдпрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реИ pipe:

/*
 * The sys-pipe entry.
 * Allocate an inode on the root device.
 * Allocate 2 file structures.
 * Put it all together with flags.
 */
pipe()
{
    register *ip, *rf, *wf;
    int r;

    ip = ialloc(rootdev);
    if(ip == NULL)
        return;
    rf = falloc();
    if(rf == NULL) {
        iput(ip);
        return;
    }
    r = u.u_ar0[R0];
    wf = falloc();
    if(wf == NULL) {
        rf->f_count = 0;
        u.u_ofile[r] = NULL;
        iput(ip);
        return;
    }
    u.u_ar0[R1] = u.u_ar0[R0]; /* wf's fd */
    u.u_ar0[R0] = r;           /* rf's fd */
    wf->f_flag = FWRITE|FPIPE;
    wf->f_inode = ip;
    rf->f_flag = FREAD|FPIPE;
    rf->f_inode = ip;
    ip->i_count = 2;
    ip->i_flag = IACC|IUPD;
    ip->i_mode = IALLOC;
}

рдЯрд┐рдкреНрдкрдгреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рд╡рдЬрд╣ рдпрд╣ рд╣реИ рдХрд┐ "рд╕рдВрд░рдЪрдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпреВ┬╗ рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ R0 ╨╕ R1 рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЖрдЗрдП рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ ialloc() рдбрд┐рд╕реНрдХ рдкрд░ рд░рдЦреЗрдВ рдЗрдиреЛрдб (рдЗрдиреЛрдб), рдФрд░ рдорджрдж рд╕реЗ рдлрд╝реИрд▓реЛрдХ() - рджреБрдХрд╛рди рджреЛ рдлрд╝рд╛рдЗрд▓. рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛, рддреЛ рд╣рдо рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рджреЛ рд╕рд┐рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЭрдВрдбреЗ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рдЗрдиреЛрдб (рдЬрд┐рд╕рдХреА рд╕рдВрджрд░реНрдн рд╕рдВрдЦреНрдпрд╛ 2 рд╣реЛ рдЬрд╛рддреА рд╣реИ) рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрдиреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВрдЧреЗред рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдореИрдВрдиреЗ рдбрд╛рд▓рд╛() рдирдП рдЗрдиреЛрдб рдореЗрдВ рд╕рдВрджрд░реНрдн рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкрдереЛрдВ рдореЗрдВред

pipe() рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдп R0 ╨╕ R1 рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдЯрд░реНрди рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдирдВрдмрд░ред falloc() рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╕реВрдЪрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рд╡рд╛рдкрд╕" рднреА рджреЗрддрд╛ рд╣реИ u.u_ar0[R0] рдФрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ред рдпрд╛рдиреА рдХреЛрдб рдХреЛ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ r рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдФрд░ рд╕реАрдзреЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ u.u_ar0[R0] рджреВрд╕рд░реА рдХреЙрд▓ рдХреЗ рдмрд╛рдж falloc().

рдЭрдВрдбрд╛ FPIPE, рдЬрд┐рд╕реЗ рд╣рдо рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛рддреЗ рд╕рдордп рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ sys2.c рдореЗрдВ rdwr(), рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ I/O рд░реВрдЯреАрди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ:

/*
 * common code for read and write calls:
 * check permissions, set base, count, and offset,
 * and switch out to readi, writei, or pipe code.
 */
rdwr(mode)
{
    register *fp, m;

    m = mode;
    fp = getf(u.u_ar0[R0]);
        /* тАж */

    if(fp->f_flag&FPIPE) {
        if(m==FREAD)
            readp(fp); else
            writep(fp);
    }
        /* тАж */
}

рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди readp() ╨▓ pipe.c рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ writep(). рдлрд┐рд░, рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкрд░рдВрдкрд░рд╛ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг рдХреЛрдб рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╡рд┐рд╡рд░рдг рдЫреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

writep(fp)
{
    register *rp, *ip, c;

    rp = fp;
    ip = rp->f_inode;
    c = u.u_count;

loop:
    /* If all done, return. */

    plock(ip);
    if(c == 0) {
        prele(ip);
        u.u_count = 0;
        return;
    }

    /*
     * If there are not both read and write sides of the
     * pipe active, return error and signal too.
     */

    if(ip->i_count < 2) {
        prele(ip);
        u.u_error = EPIPE;
        psignal(u.u_procp, SIGPIPE);
        return;
    }

    /*
     * If the pipe is full, wait for reads to deplete
     * and truncate it.
     */

    if(ip->i_size1 == PIPSIZ) {
        ip->i_mode =| IWRITE;
        prele(ip);
        sleep(ip+1, PPIPE);
        goto loop;
    }

    /* Write what is possible and loop back. */

    u.u_offset[0] = 0;
    u.u_offset[1] = ip->i_size1;
    u.u_count = min(c, PIPSIZ-u.u_offset[1]);
    c =- u.u_count;
    writei(ip);
    prele(ip);
    if(ip->i_mode&IREAD) {
        ip->i_mode =& ~IREAD;
        wakeup(ip+2);
    }
    goto loop;
}

рд╣рдо рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ u.u_count. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдЗрдиреЛрдб рдХреЛ рд▓реЙрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред plock/prele).

рдлрд┐рд░ рд╣рдо рдЗрдиреЛрдб рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдЬрдм рддрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рджреЛрдиреЛрдВ рд╕рд┐рд░реЗ рдЦреБрд▓реЗ рд░рд╣рддреЗ рд╣реИрдВ, рдХрд╛рдЙрдВрдЯрд░ 2 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдПрдХ рд▓рд┐рдВрдХ (рд╕реЗ) рдХреЛ рдкрдХрдбрд╝рдХрд░ рд░рдЦрддреЗ рд╣реИрдВ rp->f_inode), рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдХрд╛рдЙрдВрдЯрд░ 2 рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд░реАрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдиреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдЕрдкрдирд╛ рдЕрдВрдд рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдПрдХ рдмрдВрдж рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдЧрд▓рддреА рд╣реИред рдкрд╣рд▓рд╛ рддреНрд░реБрдЯрд┐ рдХреЛрдб EPIPE рдФрд░ рд╕рдВрдХреЗрдд SIGPIPE рдпреВрдирд┐рдХреНрд╕ рдХреЗ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрдиреНрд╡реЗрдпрд░ рдЦреБрд▓рд╛ рд╣реИ, рддреЛ рднреА рдпрд╣ рднрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рддрд╛рд▓рд╛ рдЦреЛрд▓ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рд╕реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдкрдврд╝реЗрдЧреА рдФрд░ рдЙрд╕рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рдЦрд╛рд▓реА рдХрд░ рджреЗрдЧреАред рдЬрдм рд╣рдо рдЬрд╛рдЧрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реМрдЯрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╕реЗ рддрд╛рд▓рд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдирдпрд╛ рд▓реЗрдЦрди рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЦрд╛рд▓реА рдЬрдЧрд╣ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рд▓рд┐рдЦрдирд╛(). рдкреИрд░рд╛рдореАрдЯрд░ i_size1 рдЗрдиреЛрдб'рдП (рдПрдХ рдЦрд╛рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде 0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдЙрд╕ рдбреЗрдЯрд╛ рдХреЗ рдЕрдВрдд рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред рдпрджрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рд╣реИ, рддреЛ рд╣рдо рдкрд╛рдЗрдкрд▓рд╛рдЗрди рднрд░ рд╕рдХрддреЗ рд╣реИрдВ i_size1 рд╕реЗ PIPESIZ. рдлрд┐рд░ рд╣рдо рд▓реЙрдХ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реА рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрдЧрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЙрддрдиреЗ рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рдЬрд┐рддрдиреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рдереАред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рдПрдХ рдирдпрд╛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдорддреМрд░ рдкрд░ рдкреИрд░рд╛рдореАрдЯрд░ i_mode рдЗрдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ r, w ╨╕ x. рд▓реЗрдХрд┐рди рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдкрдврд╝рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реА рд╣реИ IREAD ╨╕ IWRITE рдХреНрд░рдорд╢ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ рдФрд░ рдХреЙрд▓ рдХрд░рддреА рд╣реИ sleep(), рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ рдХрд░реЗрдЧреА wakeup().

рдЕрд╕рд▓реА рдЬрд╛рджреВ рд╣реЛрддрд╛ рд╣реИ sleep() ╨╕ wakeup(). рдореЗрдВ рдЗрдиреНрд╣реЗрдВ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдПрд╕рдПрд▓рдкреА.рд╕реА, рдкреНрд░рд╕рд┐рджреНрдз "рдЖрдкрд╕реЗ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ" рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рд╕реНрд░реЛрддред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдореЗрдВ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рджреЗрдЦреЗрдВ:

/*
 * Give up the processor till a wakeup occurs
 * on chan, at which time the process
 * enters the scheduling queue at priority pri.
 * The most important effect of pri is that when
 * pri<0 a signal cannot disturb the sleep;
 * if pri>=0 signals will be processed.
 * Callers of this routine must be prepared for
 * premature return, and check that the reason for
 * sleeping has gone away.
 */
sleep(chan, pri) /* тАж */

/*
 * Wake up all processes sleeping on chan.
 */
wakeup(chan) /* тАж */

рд╡рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ sleep() рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП, рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдЧреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХреЙрд▓ рдХрд░реЗрдЧреА wakeup() рдЙрд╕реА рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП. writep() ╨╕ readp() рдРрд╕реА рдпреБрдЧреНрдорд┐рдд рдХреЙрд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ pipe.c рд╣рдореЗрд╢рд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ PPIPE рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ sleep(), рддреЛ рд╕рднреА sleep() рдПрдХ рд╕рд┐рдЧреНрдирд▓ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╣реИ readp():

readp(fp)
int *fp;
{
    register *rp, *ip;

    rp = fp;
    ip = rp->f_inode;

loop:
    /* Very conservative locking. */

    plock(ip);

    /*
     * If the head (read) has caught up with
     * the tail (write), reset both to 0.
     */

    if(rp->f_offset[1] == ip->i_size1) {
        if(rp->f_offset[1] != 0) {
            rp->f_offset[1] = 0;
            ip->i_size1 = 0;
            if(ip->i_mode&IWRITE) {
                ip->i_mode =& ~IWRITE;
                wakeup(ip+1);
            }
        }

        /*
         * If there are not both reader and
         * writer active, return without
         * satisfying read.
         */

        prele(ip);
        if(ip->i_count < 2)
            return;
        ip->i_mode =| IREAD;
        sleep(ip+2, PPIPE);
        goto loop;
    }

    /* Read and return */

    u.u_offset[0] = 0;
    u.u_offset[1] = rp->f_offset[1];
    readi(ip);
    rp->f_offset[1] = u.u_offset[1];
    prele(ip);
}

рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рддрдХ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред "рд░реАрдб рдПрдВрдб рд░рд┐рдЯрд░реНрди" рд╢рд╛рдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдорддреМрд░ рдкрд░ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдкрдврд╝рдирд╛() рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛ рд╕реЗ рдЖрд░рдВрдн рдХрд░рдХреЗ рдЙрддрдирд╛ рд╣реА рдбреЗрдЯрд╛ рдкрдврд╝реЗрдВ рдЬрд┐рддрдирд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ f_offset рдкрдврд╝реЗрдВ, рдФрд░ рдлрд┐рд░ рд╕рдВрдмрдВрдзрд┐рдд рдСрдлрд╕реЗрдЯ рдХрд╛ рдорд╛рди рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред

рдмрд╛рдж рдХреЗ рд░реАрдбреНрд╕ рдкрд░, рдпрджрд┐ рд░реАрдб рдСрдлрд╕реЗрдЯ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ рд╣реИ рддреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЦрд╛рд▓реА рд╣реЛ рдЬрд╛рдПрдЧреА i_size1 рдЗрдиреЛрдб рдкрд░. рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреЛ 0 рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрдЧрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдХрдиреНрд╡реЗрдпрд░ рднрд░ рдЬрд╛рддрд╛ рд╣реИ, writep() рдкрд░ рд╕реЛ рдЬрд╛рдУ ip+1. рдФрд░ рдЕрдм рдЬрдмрдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЦрд╛рд▓реА рд╣реИ, рд╣рдо рдЗрд╕рдХреЗ рд▓реЗрдЦрди рдЪрдХреНрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЬрдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд░ рдкрдврд╝рдиреЗ рдХреЛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рддреЛ readp() рдПрдХ рдЭрдВрдбрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ IREAD рдФрд░ рд╕реЛ рдЬрд╛рдУ ip+2. рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕реЗ рдХреНрдпрд╛ рдЬрдЧрд╛рдПрдЧрд╛ writep()рдЬрдм рдпрд╣ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИред

рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдкрдврд╝реЗрдВ() рдФрд░ рд▓рд┐рдЦреЗрдВi() рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА рдХрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп "u┬╗ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдорд┐рдд I/O рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рддрд░рд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓, рдПрдХ рд╕реНрдерд┐рддрд┐, рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдмрдлрд░ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред

/*
 * Read the file corresponding to
 * the inode pointed at by the argument.
 * The actual read arguments are found
 * in the variables:
 *    u_base        core address for destination
 *    u_offset    byte offset in file
 *    u_count        number of bytes to read
 *    u_segflg    read to kernel/user
 */
readi(aip)
struct inode *aip;
/* тАж */

/*
 * Write the file corresponding to
 * the inode pointed at by the argument.
 * The actual write arguments are found
 * in the variables:
 *    u_base        core address for source
 *    u_offset    byte offset in file
 *    u_count        number of bytes to write
 *    u_segflg    write to kernel/user
 */
writei(aip)
struct inode *aip;
/* тАж */

рдЬрд╣рд╛рдБ рддрдХ "рд░реВрдврд╝рд┐рд╡рд╛рджреА" рдЕрд╡рд░реЛрдзрди рдХрд╛ рдкреНрд░рд╢реНрди рд╣реИ readp() ╨╕ writep() рдЗрдиреЛрдб рдХреЛ рддрдм рддрдХ рд▓реЙрдХ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рд╕рдорд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдПрдВ рдпрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рди рдХрд░ рд▓реЗрдВ (рдЕрд░реНрдерд╛рдд рдХреЙрд▓ рдХрд░реЗрдВ)ред wakeup). plock() ╨╕ prele() рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ: рдХреЙрд▓ рдХреЗ рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ sleep ╨╕ wakeup рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬрд╛рдЧреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрднреА рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

/*
 * Lock a pipe.
 * If its already locked, set the WANT bit and sleep.
 */
plock(ip)
int *ip;
{
    register *rp;

    rp = ip;
    while(rp->i_flag&ILOCK) {
        rp->i_flag =| IWANT;
        sleep(rp, PPIPE);
    }
    rp->i_flag =| ILOCK;
}

/*
 * Unlock a pipe.
 * If WANT bit is on, wakeup.
 * This routine is also used to unlock inodes in general.
 */
prele(ip)
int *ip;
{
    register *rp;

    rp = ip;
    rp->i_flag =& ~ILOCK;
    if(rp->i_flag&IWANT) {
        rp->i_flag =& ~IWANT;
        wakeup(rp);
    }
}

рдкрд╣рд▓реЗ рддреЛ рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ readp() рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ prele(ip) рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ wakeup(ip+1). рдкрд╣рд▓реА рдЪреАрдЬрд╝ writep() рдЗрд╕рдХреЗ рд▓реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ plock(ip), рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЧрддрд┐рд░реЛрдз рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ readp() рдЕрднреА рддрдХ рдЕрдкрдирд╛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рджреЗрдЦреЗрдВ wakeup(), рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╕реЛрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ sched() рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП readp() рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ wakeup(), рдЕрдирд▓реЙрдХ, рд╕реЗрдЯ IREAD рдФрд░ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ sleep(ip+2)- рдпрд╣ рд╕рдм рдкрд╣рд▓реЗ writep() рдЪрдХреНрд░ рдкреБрдирдГ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ.

рдпрд╣ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рд╕рд░рд▓ рдХреЛрдб, рджреВрд░рдЧрд╛рдореА рдкреНрд░рднрд╛рд╡ред

рд╕рд╛рддрд╡рд╛рдВ рд╕рдВрд╕реНрдХрд░рдг рдпреВрдирд┐рдХреНрд╕ (рдЬрдирд╡рд░реА 1979) рдПрдХ рдирдИ рдкреНрд░рдореБрдЦ рд░рд┐рд▓реАрдЬрд╝ рдереА (рдЪрд╛рд░ рд╕рд╛рд▓ рдмрд╛рдж) рдЬрд┐рд╕рдиреЗ рдХрдИ рдирдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдХрд░реНрдиреЗрд▓ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреЗрд╢ рдХреАрдВред рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ, рдпреВрдирд┐рдпрдиреЛрдВ рдФрд░ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рднреА рдЗрд╕рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡ рд╣реБрдП рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛрдб рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрджрд▓рд╛. рд╣рдо рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ.

Xv6, рдПрдХ рд╕рд░рд▓ рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕рд╛ рдХрд░реНрдиреЗрд▓

рдПрдХ рдирд╛рднрд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Xv6 рдпреВрдирд┐рдХреНрд╕ рдХреЗ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд, рд▓реЗрдХрд┐рди x86 рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзреБрдирд┐рдХ рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ред рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдФрд░ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреАрдпреВрдПрдЪрдПрд╕ рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдХреНрд╕ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдк рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреАрдбреАрдкреА 11/70 рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдкрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдХреЛрд░ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпреЛрдВ рдореЗрдВ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╢рд┐рдХреНрд╖рдг рд╕рд╛рдордЧреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ Github рдкрд░ рд╣реИрдВ.

рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИ рдкрд╛рдЗрдк.рд╕реА, рдбрд┐рд╕реНрдХ рдкрд░ рдЗрдиреЛрдб рдХреЗ рдмрдЬрд╛рдп рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдмрдлрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рддред рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ "рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди" рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрддрд╛ рд╣реВрдВ pipealloc():

#define PIPESIZE 512

struct pipe {
  struct spinlock lock;
  char data[PIPESIZE];
  uint nread;     // number of bytes read
  uint nwrite;    // number of bytes written
  int readopen;   // read fd is still open
  int writeopen;  // write fd is still open
};

int
pipealloc(struct file **f0, struct file **f1)
{
  struct pipe *p;

  p = 0;
  *f0 = *f1 = 0;
  if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0)
    goto bad;
  if((p = (struct pipe*)kalloc()) == 0)
    goto bad;
  p->readopen = 1;
  p->writeopen = 1;
  p->nwrite = 0;
  p->nread = 0;
  initlock(&p->lock, "pipe");
  (*f0)->type = FD_PIPE;
  (*f0)->readable = 1;
  (*f0)->writable = 0;
  (*f0)->pipe = p;
  (*f1)->type = FD_PIPE;
  (*f1)->readable = 0;
  (*f1)->writable = 1;
  (*f1)->pipe = p;
  return 0;

 bad:
  if(p)
    kfree((char*)p);
  if(*f0)
    fileclose(*f0);
  if(*f1)
    fileclose(*f1);
  return -1;
}

pipealloc() рд╢реЗрд╖ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ piperead(), pipewrite() ╨╕ pipeclose(). рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ sys_pipe рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рд░реИрдкрд░ рд╣реИ sysfile.c. рдореИрдВ рдЙрд╕рдХреЗ рд╕рднреА рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдЬрдЯрд┐рд▓рддрд╛ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕реНрддрд░ рдкрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрдврд╝рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рд╣реИред

рд▓рд┐рдирдХреНрд╕ 0.01

рдЖрдк Linux 0.01 рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢рд┐рдХреНрд╖рд╛рдкреНрд░рдж рд╣реЛрдЧрд╛ fs/pipe.c. рдпрд╣рд╛рдВ, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдиреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реНрд╡рдпрдВ рдЖрдзреБрдирд┐рдХ рд╕реА рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИрдХ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдХреЛрдИ рдкрд░реЗрд╢рд╛рдиреА рдирд╣реАрдВ рд╣реЛрдЧреАред рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИ write_pipe():

int write_pipe(struct m_inode * inode, char * buf, int count)
{
    char * b=buf;

    wake_up(&inode->i_wait);
    if (inode->i_count != 2) { /* no readers */
        current->signal |= (1<<(SIGPIPE-1));
        return -1;
    }
    while (count-->0) {
        while (PIPE_FULL(*inode)) {
            wake_up(&inode->i_wait);
            if (inode->i_count != 2) {
                current->signal |= (1<<(SIGPIPE-1));
                return b-buf;
            }
            sleep_on(&inode->i_wait);
        }
        ((char *)inode->i_size)[PIPE_HEAD(*inode)] =
            get_fs_byte(b++);
        INC_PIPE( PIPE_HEAD(*inode) );
        wake_up(&inode->i_wait);
    }
    wake_up(&inode->i_wait);
    return b-buf;
}

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рднреА, рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдиреЛрдб рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ SIGPIPE. рдмрд╛рдЗрдЯ-рдмрд╛рдп-рдмрд╛рдЗрдЯ рдХрд╛рд░реНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рддрд░реНрдХ рднреА sleep_on/wake_up рдЗрддрдирд╛ рдкрд░рд╛рдпрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛.

рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓, рдлреНрд░реАрдмреАрдПрд╕рдбреА, рдиреЗрдЯрдмреАрдПрд╕рдбреА, рдУрдкрдирдмреАрдПрд╕рдбреА

рдореИрдВ рдЬрд▓реНрджреА рд╕реЗ рдХреБрдЫ рдЖрдзреБрдирд┐рдХ рдЧреБрдард▓реА рдкрд░ рдЧрдпрд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рд╕реНрдХ-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ (рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ)ред рд▓рд┐рдирдХреНрд╕ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рддреАрди рдЖрдзреБрдирд┐рдХ рдмреАрдПрд╕рдбреА рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЬреЙрди рдбрд╛рдпрд╕рди рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реЛ рдЧрдП рд╣реИрдВред

рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП fs/pipe.c (рд▓рд┐рдирдХреНрд╕ рдкрд░) рдпрд╛ sys/kern/sys_pipe.c (*рдмреАрдПрд╕рдбреА рдкрд░), рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд░реНрдкрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡реЗрдХреНрдЯрд░ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ I/O рдЬреИрд╕реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕рдорд░реНрдерди рдЖрдЬ рдХреЛрдб рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдФрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди, рд▓реЙрдХ рдФрд░ рдХрд░реНрдиреЗрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдг рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпреЛрдВ рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рдкреБрд░рд╛рдиреЗ рдкреИрдЯрд░реНрди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ SIGPIPE рдФрд░ рд╡рд╛рдкрд╕ EPIPE рдПрдХ рдмрдВрдж рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░ рд▓рд┐рдЦрддреЗ рд╕рдордп) рдЗрди рд╕рднреА рдореЗрдВ, рдмрд╣реБрдд рдЕрд▓рдЧ, рдЖрдзреБрдирд┐рдХ рдХрд░реНрдиреЗрд▓ред рдореИрдВ рд╢рд╛рдпрдж рдкреАрдбреАрдкреА-11 рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рдХрднреА рд▓рд╛рдЗрд╡ рдирд╣реАрдВ рджреЗрдЦ рдкрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрд╕ рдХреЛрдб рд╕реЗ рдЕрднреА рднреА рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрдирд╛ рдмрд╛рдХреА рд╣реИ рдЬреЛ рдореЗрд░реЗ рдЬрдиреНрдо рд╕реЗ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред

2011 рдореЗрдВ рджрд┐рд╡рд┐ рдХрдкреВрд░ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд▓реЗрдЦ "рдкрд╛рдЗрдкреНрд╕ рдФрд░ рдлреАрдлреЛ рдХрд╛ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд▓рд┐рдирдХреНрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди (рдЕрдм рддрдХ) рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди рд╣реИред рдП рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╣рд╛рд▓рд┐рдпрд╛ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЙрдбрд▓ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ; рдФрд░ рдпрд╣ рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдпреВрдирд┐рдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЗрдВ "рдмрд╣реБрдд рд░реВрдврд╝рд┐рд╡рд╛рджреА рд▓реЙрдХрд┐рдВрдЧ" рд╕реЗ рдХрд┐рддрдиреА рджреВрд░ рдЪрд▓реА рдЧрдИ рд╣реИрдВред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ