рдпрд╣ рдЖрд▓реЗрдЦ рдпреВрдирд┐рдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдХреБрдЫ рд╣рдж рддрдХ рдирд┐рд░рд╛рд╢ рдерд╛ рдХрд┐ рдПрдХ рд╣рд╛рд▓рд┐рдпрд╛ рд▓реЗрдЦ рдЬрд┐рд╕рдХрд╛ рд╢реАрд░реНрд╖рдХ рдерд╛ "
рд╣рдо рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЗрдВ "рд╢рд╛рдпрдж рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╡рд┐рд╖реНрдХрд╛рд░" рд╣реИрдВ - рдЫреЛрдЯреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдХреЗ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рджрд░реНрд╢рди рдХреА рдПрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛, рдФрд░ рдкрд░рд┐рдЪрд┐рдд рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдирд╛рд░рд╛:
$ echo hello | wc -c
6
рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрддреНрдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ pipe
, рдЬрд┐рд╕рдХрд╛ рд╡рд░реНрдгрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкреГрд╖реНрдареЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЗрдВ рдЕрдВрддрд░-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ-рддрд░рдлрд╝рд╛ рдЪреИрдирд▓ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ (рд░рд╛рдЗрдЯ рдПрдВрдб) рдФрд░ рдПрдХ рдЖрдЙрдЯрдкреБрдЯ (рд░реАрдб рдПрдВрдб) рд╣реЛрддрд╛ рд╣реИред рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдЗрдирдкреБрдЯ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреЙрд▓ рдХрд░рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ
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) рдкрд░рдорд╛рдгреБ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрдЪрд╛рд░ рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдлрд╛рдЗрд▓реЗрдВ (рдЬреЛ рдРрд╕реА рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ) рдирд╣реАрдВ рдХрд░ рд╕рдХрддреАрдВред
рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде, рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкрдиреЗ рд╕рднреА рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЗрд╕рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднреЗрдЬ рд╕рдХрддреА рд╣реИред рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдкрдврд╝рдиреЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рддрдВрддреНрд░ (рдЬреИрд╕реЗ рд╕реЗрдорд╛рдлреЛрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрдард┐рди рд╕рдорд╛рдирд╛рдВрддрд░ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдХрдиреНрд╡реЗрдпрд░ рд╣рдореЗрдВ рдЗрд╕ рд╕рд╛рд░реА рдкрд░реЗрд╢рд╛рдиреА рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВред
рд╣рдо рдХреНрдпрд╛ рдЦреЛрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?
рдореИрдВ рдЕрдкрдиреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдП рдХрд┐ рдПрдХ рдХрдиреНрд╡реЗрдпрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдмрдлрд╝рд░ рдФрд░ рдХреБрдЫ рд╕реНрдерд┐рддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдкрдХреЛ рдмрдлрд╝рд░ рд╕реЗ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдкрд░ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рд╢реЗрд╖ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдЕрд╕реНрдкрд╖реНрдЯ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдХреА рдкреБрд╖реНрдЯрд┐ рдпрд╛ рдЦрдВрдбрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЬреНрдЬреНрд╡рд▓ рд▓реИрдВрдкрд▓рд╛рдЗрдЯ рдХреЗ рддрд╣рдд рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рддреИрдпрд╛рд░ рд░рд╣реЗрдВред
рд╣рдо рдХрд╣рд╛рдБ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ?
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдкреНрд░рд╕рд┐рджреНрдз рдкреБрд╕реНрддрдХ рдХреА рдореЗрд░реА рдкреНрд░рддрд┐ рдХрд╣рд╛рдБ рд╣реИред
рдЯреАрдпреВрдПрдЪрдПрд╕ рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдореЗрдВ рдШреВрдордирд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдп рдореЗрдВ рдЬрд╛рдиреЗ рдЬреИрд╕рд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рд╕рд╛рдЭрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдкреБрд░рд╛рдиреЗ рдХреИрд╕реЗрдЯ рдФрд░ рдкреНрд░рд┐рдВрдЯрдЖрдЙрдЯ рд╕реЗ рдереЛрдбрд╝рд╛-рдереЛрдбрд╝рд╛ рдХрд░рдХреЗ рдЗрд╕ рд╕рд╛рд░реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдореИрдВ рдЙрди рдЯреБрдХрдбрд╝реЛрдВ рд╕реЗ рднрд▓реАрднрд╛рдВрддрд┐ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ рдЬреЛ рдЕрднреА рднреА рдЧрд╛рдпрдм рд╣реИрдВред
рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдкреНрд░рд╛рдЪреАрди рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдзреБрдирд┐рдХ рдХреЛрд░ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрдпреЛрдЧ рд╕реЗ, pipe
рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ 42 рд╣реИ sysent[]
. рд╕рдВрдпреЛрдЧ?
рдкрд╛рд░рдВрдкрд░рд┐рдХ рдпреВрдирд┐рдХреНрд╕ рдХрд░реНрдиреЗрд▓ (1970-1974)
рдореБрдЭреЗ рдХреЛрдИ рдирд┐рд╢рд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ pipe(2)
рди рддреЛ рдореЗрдВ
рдЯреАрдпреВрдПрдЪрдПрд╕ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐
рдпреВрдирд┐рдХреНрд╕ рдХрд╛ рддреАрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд░реНрдиреЗрд▓ рд╡рд╛рд▓рд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдерд╛, рд▓реЗрдХрд┐рди рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рднреА рдерд╛ред 1973 рдХреЗ рджреМрд░рд╛рди, рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдЪрд▓ рд░рд╣рд╛ рдерд╛, рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕реА рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕ рддрд░рд╣ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рдЪреМрдереЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖред
рдПрдХ рдкрд╛рдардХ рдХреЛ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╕реНрдХреИрди рдорд┐рд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рдбреМрдЧ рдореИрдХрд▓рд░реЙрдп рдиреЗ "рдмрдЧреАрдЪреЗ рдХреА рдирд▓реА рдХреА рддрд░рд╣ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ" рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред
рдмреНрд░рд╛рдпрди рдХрд░реНрдирд┐рдШрди рдХреА рдХрд┐рддрд╛рдм рдореЗрдВ
рдЬрдм рдпреВрдирд┐рдХреНрд╕ рд╕рд╛рдордиреЗ рдЖрдпрд╛, рддреЛ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдкреНрд░рддрд┐ рдореЗрд░реЗ рдЬреБрдиреВрди рдиреЗ рдореБрдЭреЗ рдУрдПрд╕ рд▓реЗрдЦрдХ, рдХреЗрди рдереЙрдореНрдкрд╕рди рд╕реЗ рдХреБрдЫ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рди рдХреЗрд╡рд▓ рдбрд┐рд╡рд╛рдЗрд╕ рддрдХ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреАред рдХреЗрди рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдиреНрдпреВрдирддрдорд╡рд╛рджреА рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╣ рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд╕реНрдЯрдо рд╕реБрд╡рд┐рдзрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдПред рдХреНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕реАрдзрд╛ рд▓реЗрдЦрди рдХрд┐рд╕реА рдордзреНрдпрд╡рд░реНрддреА рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реИ? рдФрд░ рдХреЗрд╡рд▓ рдЬрдм рдореИрдВрдиреЗ рдЖрдХрд░реНрд╖рдХ рдирд╛рдо "рдкрд╛рдЗрдкрд▓рд╛рдЗрди" рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛, рддреЛ рдХреЗрди рдиреЗ рдЕрдВрддрддрдГ рдХрд╣рд╛: "рдореИрдВ рдпрд╣ рдХрд░реВрдВрдЧрд╛!"ред
рдФрд░ рдХрд┐рдпрд╛ред рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╢рд╛рдо, рдХреЗрди рдиреЗ рдХрд░реНрдиреЗрд▓ рдФрд░ рд╢реЗрд▓ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рдЗрдирдкреБрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рдирдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдп рдХрд┐рдП (рдЬреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдЖ рд╕рдХрддреЗ рд╣реИрдВ), рдФрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдмрджрд▓ рджрд┐рдПред рдЕрдЧрд▓реЗ рджрд┐рди, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд▓рдЧрд╛ред рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рддрдХ, рд╕рдЪрд┐рд╡реЛрдВ рдиреЗ рд╡рд░реНрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рдкреНрд░рд┐рдВрдЯрд░ рддрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдХреЗрди рдиреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХреНрд▓реАрдирд░ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдПрдкреАрдЖрдИ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬреЛ рддрдм рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдпреВрдирд┐рдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдЦреЛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдб C рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реБрдЖ рд╣реИ
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрд╛рда рд╣реИ pipe(2)
рджреЛрдиреЛрдВ рд░рд┐рд▓реАрдЬрд╝реЛрдВ рд╕реЗ, рдЗрд╕рд▓рд┐рдП рдЖрдк рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЦреЛрдЬрдХрд░ рд╢реБрд░реБрдЖрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ pipe(2)
рдЕрд╕реЗрдВрдмрд▓рд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкреЗрдХреНрд╖рд┐рдд рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд╛рдЗрдк рдПрдХ I/O рддрдВрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реМрдЯрд╛рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ 504 рдмрд╛рдЗрдЯреНрд╕ рдбреЗрдЯрд╛ рддрдХ рдмрдлрд╝рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд▓рдВрдмрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдкрдврд╝рддреЗ рд╕рдордп, рдмрдлрд╝рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд▓реЗ рд╡рд░реНрд╖ рддрдХ, рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕реА рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ pipe(fildes)
┬╗:
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд╛рдЗрдк рдПрдХ I/O рддрдВрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реМрдЯрд╛рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ r1 (resp. fildes[1]) рдореЗрдВ рд▓реМрдЯрд╛рдП рдЧрдП рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, 4096 рдмрд╛рдЗрдЯреНрд╕ рдбреЗрдЯрд╛ рддрдХ рдмрдлрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджреА рдЬрд╛рддреА рд╣реИред рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдкрдврд╝рддреЗ рд╕рдордп, рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ r0 (resp. fildes[0]) рдкрд░ рд▓реМрдЯ рдЖрддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рд▓реЗрддрд╛ рд╣реИред
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рджреЛ (рдпрд╛ рдЕрдзрд┐рдХ) рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ (рдмрд╛рдж рдХреЗ рдЖрдордВрддреНрд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд) рд╣реЛрддреА рд╣реИрдВ рдХрд╛рдВрдЯрд╛) рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ рдкрдврд╝рдирд╛ ╨╕ рд▓рд┐рдЦрдирд╛.
рд╢реЗрд▓ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреБрдбрд╝реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд░реИрдЦрд┐рдХ рд╕рд░рдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдЦрд╛рд▓реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди (рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдмрдлрд╝рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ) рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдЬрд┐рд╕рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рд┐рд░рд╛ рд╣реИ (рд╕рднреА рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдмрдВрдж рд╣реИрдВ) "рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрдд" рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рд╛рдЗрдЯ рдХреЙрд▓ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж
рдпреВрдирд┐рдХреНрд╕ рдЫрдард╛ рд╕рдВрд╕реНрдХрд░рдг (1975)
рдпреВрдирд┐рдХреНрд╕ рд╕реНрд░реЛрдд рдХреЛрдб рдкрдврд╝рдирд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ
рдХрдИ рд╕рд╛рд▓реЛрдВ рддрдХ рдХрд┐рддрд╛рдм рд▓рд╛рдпрдВрд╕ рдмреЗрд▓ рд▓реИрдмреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдЙрдкрд▓рдмреНрдз рдпреВрдирд┐рдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдкрд░ рдПрдХрдорд╛рддреНрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдиреЗ рд╢рд┐рдХреНрд╖рдХреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдереА, рд╕рд╛рддрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдиреЗ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рджрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдкреБрд╕реНрддрдХ рдХреЛ рдЕрд╡реИрдз рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдкреНрд░рддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЖрдЬ рдЖрдк рдкреБрд╕реНрддрдХ рдХреА рдкреБрдирд░реНрдореБрджреНрд░рд┐рдд рдкреНрд░рддрд┐ рдЦрд░реАрдж рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдХрд╡рд░ рдкрд░ рдХрд╛рдкрд┐рдпрд░ рдкрд░ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рд╡реЙрд░реЗрди рдЯреВрдореА (рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЯреАрдпреВрдПрдЪрдПрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХреА) рдХреЛ рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
15 рд╡рд░реНрд╖ рд╕реЗ рднреА рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рджрд┐рдП рдЧрдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдПрдХ рдкреНрд░рддрд┐ рдЯрд╛рдЗрдк рдХреА рдереА рд▓рд╛рдпрдВрд╕рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдиреНрдп рдкреНрд░рддрд┐рдпреЛрдВ рд╕реЗ рдЕрдкрдиреА рдкреНрд░рддрд┐ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдИред рдЯреАрдпреВрдПрдЪрдПрд╕ рдЕрднреА рддрдХ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдирд╣реАрдВ рдерд╛, рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдкреБрд░рд╛рдиреЗ рд╕реНрд░реЛрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рдереАред рд▓реЗрдХрд┐рди 1988 рдореЗрдВ рдореБрдЭреЗ 9 рдЯреНрд░реИрдХ рд╡рд╛рд▓рд╛ рдПрдХ рдкреБрд░рд╛рдирд╛ рдЯреЗрдк рдорд┐рд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рдкреАрдбреАрдкреА11 рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдмреИрдХрдЕрдк рдерд╛ред рдпрд╣ рдЬрд╛рдирдирд╛ рдХрдард┐рди рдерд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдХреНрд╖реБрдгреНрдг /usr/src/ рдкреЗрдбрд╝ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ 1979 рдЕрдВрдХрд┐рдд рдерд╛, рдЬреЛ рддрдм рднреА рдкреНрд░рд╛рдЪреАрди рджрд┐рдЦрддрд╛ рдерд╛ред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдпрд╣ рд╕рд╛рддрд╡рд╛рдВ рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдкреАрдбрдмреНрд▓реВрдмреА рд╡реНрдпреБрддреНрдкрдиреНрди рдерд╛ред
рдореИрдВрдиреЗ рдЦреЛрдЬ рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдФрд░ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ред рдХреЛрдб рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд╣реА рд░рд╣рд╛, рдХреБрдЫ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЖрдзреБрдирд┐рдХ рдЯреЛрдХрди += рдХреЛ рдЕрдкреНрд░рдЪрд▓рд┐рдд =+ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдХреБрдЫ рдХреЛ рдмрд╕ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХреБрдЫ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВред
рдФрд░ рдЖрдЬ рд╣рдо рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдЯреАрдпреВрдПрдЪрдПрд╕ рдкрд░ рдСрдирд▓рд╛рдЗрди рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ
рд╡реИрд╕реЗ, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдХрд░реНрдирд┐рдШрди рдФрд░ рд░рд┐рдЪреА рдХреЗ рдХрд╛рд▓ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕реА-рдХреЛрдб рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрд╕рдХреА рд╣реИ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛. рдРрд╕рд╛ рдЕрдХреНрд╕рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдкрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рдВрдХреАрд░реНрдг рдкреНрд░рджрд░реНрд╢рди рдХреНрд╖реЗрддреНрд░ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдкрдХ рд╕рдВрдкрд╛рджрди рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдХреЗ рд╕реНрдирд┐рдкреЗрдЯ рдбрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред
рд╢реАрдШреНрд░
/*
* 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 рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкреНрд░рд╢реНрди рд╣реИ, рд╡реЗ рдЗрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ
рдпрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реИ 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
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЖрдЗрдП рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
pipe()
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдп R0
╨╕ R1
рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдЯрд░реНрди рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдирдВрдмрд░ред falloc()
рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╕реВрдЪрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рд╡рд╛рдкрд╕" рднреА рджреЗрддрд╛ рд╣реИ u.u_ar0[R0]
рдФрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ред рдпрд╛рдиреА рдХреЛрдб рдХреЛ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ r
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдФрд░ рд╕реАрдзреЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ u.u_ar0[R0]
рджреВрд╕рд░реА рдХреЙрд▓ рдХреЗ рдмрд╛рдж falloc()
.
рдЭрдВрдбрд╛ FPIPE
, рдЬрд┐рд╕реЗ рд╣рдо рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛рддреЗ рд╕рдордп рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ
/*
* 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()
рдЬрдм рдпрд╣ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИред
рдкрд░ рдЯрд┐рдкреНрдкрдгреА 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()
рдЪрдХреНрд░ рдкреБрдирдГ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ.
рдпрд╣ рдЫрдареЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рд╕рд░рд▓ рдХреЛрдб, рджреВрд░рдЧрд╛рдореА рдкреНрд░рднрд╛рд╡ред
Xv6, рдПрдХ рд╕рд░рд▓ рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕рд╛ рдХрд░реНрдиреЗрд▓
рдПрдХ рдирд╛рднрд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИ 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
рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рд░реИрдкрд░ рд╣реИ
рд▓рд┐рдирдХреНрд╕ 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