рд╣рд╛ рд▓реЗрдЦ рдпреБрдирд┐рдХреНрд╕ рдХрд░реНрдирд▓рдордзреАрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЛ. рдореА рдХрд╛рд╣реАрд╕рд╛ рдирд┐рд░рд╛рд╢ рдЭрд╛рд▓реЛ рдХреА рдЕрд▓реАрдХрдбреАрд▓ рд▓реЗрдЦ "
рдЖрдореНрд╣реА рдХрд╢рд╛рдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд?
рдкрд╛рдЗрдкрд▓рд╛рдЗрди, "рдХрджрд╛рдЪрд┐рдд рдпреБрдирд┐рдХреНрд╕рдордзреАрд▓ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рд╢реЛрдз," рд╣реЗ рд▓рд╣рд╛рди рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдирд╛ рдПрдХрддреНрд░ рдЬреЛрдбрдгреНрдпрд╛рдЪреНрдпрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдпреБрдирд┐рдХреНрд╕ рддрддреНрддреНрд╡рдЬреНрдЮрд╛рдирд╛рдЪреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрд╣реЗ, рддрд╕реЗрдЪ рдХрдорд╛рдВрдб рд▓рд╛рдЗрдирд╡рд░реАрд▓ рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдЪрд┐рдиреНрд╣ рдЖрд╣реЗ:
$ 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 рд╢реА рдЬреБрд│рдгреНрдпрд╛рд╕рд╛рдареА descriptors 2 рдЖрдгрд┐ 3 рдЪреЗ "рдкреБрдирд░реНрдирд╛рдорд┐рдд" рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА dup4 рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рддреЗ.
рдкрд╛рдИрдкреНрд╕рд╢рд┐рд╡рд╛рдп, рд╢реЗрд▓рд▓рд╛ рдПрдХрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд▓рд┐рд╣рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ рдЖрдгрд┐ рдлрд╛рдЗрд▓рдордзреАрд▓ рдбреЗрдЯрд╛ рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рджреБрд╕рд░реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдд рдкрд╛рд╕ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рдкрд░рд┐рдгрд╛рдореА, рдЖрдореНрд╣реА рдЕрдзрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЗ рдЖрдгрд┐ рдбрд┐рд╕реНрдХ рдЬрд╛рдЧрд╛ рд╡рд╛рдпрд╛ рдШрд╛рд▓рд╡реВ. рддрдерд╛рдкрд┐, рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗрд╡рд│ рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдЖрд╣реЗрдд рдХрд╛рд░рдг рддреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рддрд╛рддреНрдкреБрд░рддреНрдпрд╛ рдлрд╛рдпрд▓реАрдВрдЪрд╛ рд╡рд╛рдкрд░ рдЯрд╛рд│рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддрд╛рдд:
рдЬрд░ рдПрдЦрд╛рджреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд░рд┐рдХреНрдд рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди рд╡рд╛рдЪрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рдд рдЕрд╕реЗрд▓ рддрд░
read(2)
рдбреЗрдЯрд╛ рдЙрдкрд▓рдмреНрдз рд╣реЛрдИрдкрд░реНрдпрдВрдд рдмреНрд▓реЙрдХ рдХрд░реЗрд▓. рдЬрд░ рдПрдЦрд╛рджреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реНрдг рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╡рд░ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЗ, рддрд░write(2)
рд▓реЗрдЦрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди рдкреБрд░реЗрд╕рд╛ рдбреЗрдЯрд╛ рд╡рд╛рдЪрд▓рд╛ рдЬрд╛рдИрдкрд░реНрдпрдВрдд рдмреНрд▓реЙрдХ рдХрд░реЗрд▓.
POSIX рдЖрд╡рд╢реНрдпрдХрддреЗрдкреНрд░рдорд╛рдгреЗ, рд╣реА рдПрдХ рдорд╣рддреНрддреНрд╡рд╛рдЪреА рдорд╛рд▓рдорддреНрддрд╛ рдЖрд╣реЗ: рдкрд░реНрдпрдВрдд рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╡рд░ рд▓рд┐рд╣рд┐рдгреЗ PIPE_BUF
рдмрд╛рдЗрдЯреНрд╕ (рдХрд┐рдорд╛рди 512) рдЕрдгреВ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реВрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирджреНрд╡рд╛рд░реЗ рдПрдХрдореЗрдХрд╛рдВрд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзреВ рд╢рдХрддреАрд▓ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдирд┐рдпрдорд┐рдд рдлрд╛рдЗрд▓реНрд╕ (рдЬреНрдпрд╛ рдЕрд╢реА рд╣рдореА рджреЗрдд тАЛтАЛрдирд╛рд╣реАрдд) рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реАрдд.
рдирд┐рдпрдорд┐рдд рдлрд╛рдЗрд▓ рд╡рд╛рдкрд░рддрд╛рдирд╛, рдПрдЦрд╛рджреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрд┐рдЪреЗ рд╕рд░реНрд╡ рдЖрдЙрдЯрдкреБрдЯ рддреНрдпрд╛рд╡рд░ рд▓рд┐рд╣реВ рд╢рдХрддреЗ рдЖрдгрд┐ рддреА рджреБрд╕рд▒реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрдХрдбреЗ рдкрд╛рдард╡реВ рд╢рдХрддреЗ. рдХрд┐рдВрд╡рд╛ рд▓реЗрдЦрди рдХрд┐рдВрд╡рд╛ рд╡рд╛рдЪрди рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рдПрдХрдореЗрдХрд╛рдВрдирд╛ рд╕реВрдЪрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмрд╛рд╣реНрдп рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рдпрдВрддреНрд░рдгрд╛ (рд╕реЗрдорд╛рдлреЛрд░ рд╕рд╛рд░рдЦреА) рд╡рд╛рдкрд░реВрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрддреНрдпрдВрдд рд╕рдорд╛рдВрддрд░ рдореЛрдбрдордзреНрдпреЗ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрддрд╛рдд. рдХрдиреНрд╡реНрд╣реЗрдпрд░ рдЖрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рд╕рд░реНрд╡ рддреНрд░рд╛рд╕рд╛рдкрд╛рд╕реВрди рд╡рд╛рдЪрд╡рддрд╛рдд.
рдЖрдореНрд╣реА рдХрд╛рдп рд╢реЛрдзрдд рдЖрд╣реЛрдд?
рдореА рддреЗ рд╕реЛрдкреНрдпрд╛ рднрд╛рд╖реЗрдд рд╕рдордЬрд╛рд╡реВрди рд╕рд╛рдВрдЧреЗрди рдЬреЗрдгреЗрдХрд░реВрди рдХрдиреНрд╡реНрд╣реЗрдпрд░ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрддреЗ рдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░рдгреЗ рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рд╕реЛрдкреЗ рд╣реЛрдИрд▓. рддреБрдореНрд╣рд╛рд▓рд╛ рдореЗрдорд░реАрдордзреНрдпреЗ рдмрдлрд░ рдЖрдгрд┐ рдХрд╛рд╣реА рд░рд╛рдЬреНрдп рд╡рд╛рдЯрдк рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рдмрдлрд░рдордзреВрди рдбреЗрдЯрд╛ рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдХрд╛рдврдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓. рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕рд╡рд░ рд╡рд╛рдЪрди рдЖрдгрд┐ рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рдиреНрд╕ рджрд░рдореНрдпрд╛рди рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд╣реА рд╕рд╛рдзрдирд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓. рдЖрдгрд┐ рд╡рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрддрдирд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рд▓реЙрдХрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓.
рдЖрддрд╛ рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рдорд╛рдирд╕рд┐рдХ рдореЙрдбреЗрд▓рдЪреА рдкреБрд╖реНрдЯреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ рдЦреЛрдЯреЗ рдард░рд╡рдгреНрдпрд╛рд╕рд╛рдареА рддреЗрдЬрд╕реНрд╡реА рджрд┐рд╡реНрдпрд╛рдЦрд╛рд▓реА рдХрд░реНрдирд▓ рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдЪреА рдЪреМрдХрд╢реА рдХрд░рдгреНрдпрд╛рд╕ рддрдпрд╛рд░ рдЖрд╣реЛрдд. рдкрд░рдВрддреБ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЧреЛрд╖реНрдЯреАрдВрд╕рд╛рдареА рдиреЗрд╣рдореА рддрдпрд╛рд░ рд░рд╣рд╛.
рдЖрдореНрд╣реА рдХреБрдареЗ рдмрдШрддреЛрдп?
рдорд╛рдЭреНрдпрд╛ рдкреНрд░рд╕рд┐рджреНрдз рдкреБрд╕реНрддрдХрд╛рдЪреА рдкреНрд░рдд рдХреБрдареЗ рдЖрд╣реЗ рд╣реЗ рдорд▓рд╛ рдорд╛рд╣реАрдд рдирд╛рд╣реА "
TUHS рдЖрд░реНрдХрд╛рдЗрд╡реНрд╣рдЬрдордзреВрди рднрдЯрдХрдгреЗ рдореНрд╣рдгрдЬреЗ рдПрдЦрд╛рджреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпрд╛рд▓рд╛ рднреЗрдЯ рджреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ. рдЖрдореНрд╣реА рдЖрдордЪрд╛ рд╕рд╛рдорд╛рдпрд┐рдХ рдЗрддрд┐рд╣рд╛рд╕ рдкрд╛рд╣реВ рд╢рдХрддреЛ рдЖрдгрд┐ рдЬреБрдиреНрдпрд╛ рдЯреЗрдкреНрд╕ рдЖрдгрд┐ рдкреНрд░рд┐рдВрдЯреНрд╕рдордзреВрди рд╣реЗ рд╕рд░реНрд╡ рд╕рд╛рд╣рд┐рддреНрдп рдкрд░рдд рдорд┐рд│рд╡рдгреНрдпрд╛рдЪреНрдпрд╛ рдЕрдиреЗрдХ рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдкреНрд░рдпрддреНрдирд╛рдВрдмрджреНрджрд▓ рдорд▓рд╛ рдЖрджрд░ рдЖрд╣реЗ. рдЖрдгрд┐ рдЕрдЬреВрдирд╣реА рд╣рд░рд╡рд▓реЗрд▓реНрдпрд╛ рддреБрдХрдбреНрдпрд╛рдВрдмрджреНрджрд▓ рдорд▓рд╛ рддреАрд╡реНрд░рддреЗрдиреЗ рдЬрд╛рдгреАрд╡ рдЖрд╣реЗ.
рдХрдиреНрд╡реНрд╣реЗрдпрд░реНрд╕рдЪреНрдпрд╛ рдкреНрд░рд╛рдЪреАрди рдЗрддрд┐рд╣рд╛рд╕рд╛рдмрджреНрджрд▓рдЪреА рдЖрдордЪреА рдЙрддреНрд╕реБрдХрддрд╛ рдкреВрд░реНрдг рдХреЗрд▓реНрдпрд╛рд╡рд░, рдЖрдореНрд╣реА рддреБрд▓рдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдзреБрдирд┐рдХ рдХрд░реНрдирд▓ рдкрд╛рд╣реВ рд╢рдХрддреЛ.
рддрд╕реЗ, pipe
рдЯреЗрдмрд▓рдордзреНрдпреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ 42 рдЖрд╣реЗ sysent[]
. рдпреЛрдЧрд╛рдпреЛрдЧ?
рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ рдпреБрдирд┐рдХреНрд╕ рдХрд░реНрдирд▓ (1970-1974)
рдорд▓рд╛ рдХрд╛рд╣реА рдЦреБрдгрд╛ рд╕рд╛рдкрдбрд▓реНрдпрд╛ рдирд╛рд╣реАрдд pipe(2)
рдордзреНрдпреЗ рдирд╛рд╣реА
рдЯреАрдпреВрдПрдЪрдПрд╕ рдореНрд╣рдгрддреЗ рдХреА
рдпреБрдирд┐рдХреНрд╕ 1973рд░реА рдЖрд╡реГрддреНрддреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖реЗрдд рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдХрд░реНрдирд▓ рдЕрд╕рд▓реЗрд▓реА рд╢реЗрд╡рдЯрдЪреА рдЖрд╡реГрддреНрддреА рд╣реЛрддреА, рдкрд░рдВрддреБ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╕рд╣ рдкрд╣рд┐рд▓реА рдЖрд╡реГрддреНрддреА рджреЗрдЦреАрд▓ рд╣реЛрддреА. XNUMX рдЪреНрдпрд╛ рджрд░рдореНрдпрд╛рди, рддрд┐рд╕рд░реА рдЖрд╡реГрддреНрддреА рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдп рдХреЗрд▓реЗ рдЧреЗрд▓реЗ, рдХрд░реНрдирд▓ C рдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рд▓рд╛ рдЧреЗрд▓рд╛ рдЖрдгрд┐ рдореНрд╣рдгреВрди рдпреБрдирд┐рдХреНрд╕рдЪреА рдЪреМрдереА рдЖрд╡реГрддреНрддреА рдЖрд▓реА.
рдПрдХрд╛ рд╡рд╛рдЪрдХрд╛рд▓рд╛ рдПрдХрд╛ рджрд╕реНрддрдРрд╡рдЬрд╛рдЪреЗ рд╕реНрдХреЕрди рд╕рд╛рдкрдбрд▓реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдбрдЧ рдореЕрдХрд┐рд▓рд░реЙрдпрдиреЗ "рдЧрд╛рд░реНрдбрди рд╣реЛрдЬрд╕рд╛рд░рдЦреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрдиреЗрдХреНрдЯ рдХрд░рдгреЗ" рдЪреА рдХрд▓реНрдкрдирд╛ рдорд╛рдВрдбрд▓реА.
рдмреНрд░рд╛рдпрди рдХрд░реНрдирд┐рдШрди рдпрд╛рдВрдЪреНрдпрд╛ рдкреБрд╕реНрддрдХрд╛рдд
рдЬреЗрд╡реНрд╣рд╛ рдпреБрдирд┐рдХреНрд╕ рдмрд╛рд╣реЗрд░ рдЖрд▓реЗ, рддреЗрд╡реНрд╣рд╛ рдорд╛рдЭреНрдпрд╛ рдХреЙрд░реЛрдЯреАрдирдмрджреНрджрд▓рдЪреНрдпрд╛ рдЖрдХрд░реНрд╖рдгрд╛рдореБрд│реЗ рдорд▓рд╛ OS рдЪреЗ рд▓реЗрдЦрдХ, рдХреЗрди рдереЙрдореНрдкрд╕рди рдпрд╛рдВрдирд╛ рдПрдХрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╡рд░ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдбреЗрдЯрд╛ рдХреЗрд╡рд│ рдбрд┐рд╡реНрд╣рд╛рдЗрд╕рд╡рд░рдЪ рдирд╛рд╣реА рддрд░ рджреБрд╕рд▒реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕рд╛рдареА рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рджреЗрдЦреАрд▓ рд╡рд┐рдЪрд╛рд░рд▓реЗ. рдХреЗрдирдиреЗ рдард░рд╡рд▓реЗ рдХреА рд╣реЗ рд╢рдХреНрдп рдЖрд╣реЗ. рддрдерд╛рдкрд┐, рдорд┐рдирд┐рдорд▓рд┐рд╕реНрдЯ рдореНрд╣рдгреВрди, рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд╕реНрдЯрдо рдлрдВрдХреНрд╢рдирдиреЗ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдмрдЬрд╛рд╡рд╛рд╡реА рдЕрд╢реА рддреНрдпрд╛рдВрдЪреА рдЗрдЪреНрдЫрд╛ рд╣реЛрддреА. рдЗрдВрдЯрд░рдореАрдбрд┐рдПрдЯ рдлрд╛рдЗрд▓рд╡рд░ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрдордзреНрдпреЗ рдереЗрдЯ рд▓рд┐рд╣рд┐рдгреЗ рд╣рд╛ рдЦрд░реЛрдЦрд░рдЪ рдореЛрдард╛ рдлрд╛рдпрджрд╛ рдЖрд╣реЗ рдХрд╛? рдЬреЗрд╡реНрд╣рд╛ рдореА рдЖрдХрд░реНрд╖рдХ рдирд╛рд╡ "рдкрд╛рдЗрдкрд▓рд╛рдЗрди" рдЖрдгрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрдордзреАрд▓ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рд╕рд╛рдареА рд╡рд╛рдХреНрдпрд░рдЪрдирд╛рдЪреЗ рд╡рд░реНрдгрди рдЕрд╕рд▓реЗрд▓рд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рдареЗрд╡рд▓рд╛ рддреЗрд╡реНрд╣рд╛рдЪ рдХреЗрдирдиреЗ рд╢реЗрд╡рдЯреА рдЙрджреНрдЧрд╛рд░ рдХрд╛рдврд▓реЗ: "рдореА рддреЗ рдХрд░реЗрди!"
рдЖрдгрд┐ рдХреЗрд▓реЗ. рдПрдХрд╛ рднрдпрдВрдХрд░ рд╕рдВрдзреНрдпрд╛рдХрд╛рд│реА, рдХреЗрдирдиреЗ рдХрд░реНрдирд▓ рдЖрдгрд┐ рд╢реЗрд▓ рдмрджрд▓рд▓реЗ, рддреНрдпрд╛рдВрдиреА рдЗрдирдкреБрдЯ рдХрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░рд▓реЗ (рдЬреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди рдпреЗрдК рд╢рдХрддреЗ) рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдорд╛рдирдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╢реНрдЪрд┐рдд рдХреЗрд▓реЗ рдЖрдгрд┐ рдлрд╛рдЗрд▓рдЪреА рдирд╛рд╡реЗ рджреЗрдЦреАрд▓ рдмрджрд▓рд▓реА. рджреБрд╕рд▒реНрдпрд╛ рджрд┐рд╡рд╢реА, рдкрд╛рдИрдкрд▓рд╛рдИрди рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдордзреНрдпреЗ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдК рд▓рд╛рдЧрд▓реНрдпрд╛. рдЖрдард╡рдбреНрдпрд╛рдЪреНрдпрд╛ рдЕрдЦреЗрд░реАрд╕, рд╕рдЪрд┐рд╡ рд╡рд░реНрдб рдкреНрд░реЛрд╕реЗрд╕рд░рд╡рд░реВрди рдкреНрд░рд┐рдВрдЯрд░рд╡рд░ рдХрд╛рдЧрджрдкрддреНрд░реЗ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рддреНрдпрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рдд рд╣реЛрддреЗ. рдереЛрдбреНрдпрд╛ рд╡реЗрд│рд╛рдиреЗ, рдХреЗрдирдиреЗ рдореВрд│ API рдЖрдгрд┐ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдХреНрд▓реАрдирд░ рдХрдиреНрд╡реНрд╣реЗрдиреНрд╢рдиреНрд╕рд╕рд╣ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдЪрд╛ рд╡рд╛рдкрд░ рдЧреБрдВрдбрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА рдмрджрд▓рд▓реА, рдЬреА рддреЗрд╡реНрд╣рд╛рдкрд╛рд╕реВрди рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдд рдЖрд╣реЗ.
рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рдпреБрдирд┐рдХреНрд╕ рдХрд░реНрдирд▓рдЪреНрдпрд╛ рддрд┐рд╕рд▒реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдЧрдорд╛рд╡рд▓рд╛ рдЖрд╣реЗ. рдЖрдгрд┐ рдЬрд░реА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХрд░реНрдирд▓ рд╕реЛрд░реНрд╕ рдХреЛрдб C рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ
рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдордЬрдХреВрд░ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдЖрд╣реЗ pipe(2)
рджреЛрдиреНрд╣реА рд░рд┐рд▓реАрдЭрдордзреВрди, рдЬреЗрдгреЗрдХрд░реВрди рддреБрдореНрд╣реА рджрд╕реНрддрдРрд╡рдЬ рд╢реЛрдзреВрди рдкреНрд░рд╛рд░рдВрдн рдХрд░реВ рд╢рдХрддрд╛ pipe(2)
рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖реЗрдд рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдлрдХреНрдд рдПрдХ рдлрд╛рдЗрд▓ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдкрд░рдд рдХрд░рддреЗ, рдкрд░рдВрддреБ рдЖрдзреАрдЪ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЛрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ:
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд╛рдИрдк рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдирд╛рд╡рд╛рдЪреА рдЗрдирдкреБрдЯ/рдЖрдЙрдЯрдкреБрдЯ рдпрдВрддреНрд░рдгрд╛ рддрдпрд╛рд░ рдХрд░рддреЗ. рд░рд┐рдЯрд░реНрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░рдЪрд╛ рд╡рд╛рдкрд░ рд╡рд╛рдЪрди рдЖрдгрд┐ рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рдиреНрд╕рд╕рд╛рдареА рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдЬреЗрд╡реНрд╣рд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╡рд░ рдХрд╛рд╣реАрддрд░реА рд▓рд┐рд╣рд┐рд▓реЗ рдЬрд╛рддреЗ, рддреЗрд╡реНрд╣рд╛ 504 рдмрд╛рдЗрдЯреНрд╕рдкрд░реНрдпрдВрдд рдбреЗрдЯрд╛ рдмрдлрд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рддреНрдпрд╛рдирдВрддрд░ рд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд▓рдВрдмрд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ. рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди рд╡рд╛рдЪрддрд╛рдирд╛, рдмрдлрд░ рдХреЗрд▓реЗрд▓рд╛ рдбреЗрдЯрд╛ рдХрд╛рдвреВрди рдШреЗрддрд▓рд╛ рдЬрд╛рддреЛ.
рдкреБрдвреАрд▓ рд╡рд░реНрд╖реА рдХрд░реНрдирд▓ C рдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рд▓рд╛ рдЧреЗрд▓рд╛ рд╣реЛрддрд╛, рдЖрдгрд┐ pipe(fildes)
"
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд╛рдИрдк рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдирд╛рд╡рд╛рдЪреА рдЗрдирдкреБрдЯ/рдЖрдЙрдЯрдкреБрдЯ рдпрдВрддреНрд░рдгрд╛ рддрдпрд╛рд░ рдХрд░рддреЗ. рд░рд┐рдЯрд░реНрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓рдЪреЗ рд╡рд░реНрдгрди рд╡рд╛рдЪрди рдЖрдгрд┐ рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рдиреНрд╕рдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдЬреЗрд╡реНрд╣рд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╡рд░ рдХрд╛рд╣реАрддрд░реА рд▓рд┐рд╣рд┐рд▓реЗ рдЬрд╛рддреЗ, рддреЗрд╡реНрд╣рд╛ r1 (resp. fildes[1]) рдордзреНрдпреЗ рдкрд░рдд рдЖрд▓реЗрд▓реЗ рд╣рдБрдбрд▓ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ, рдбреЗрдЯрд╛рдЪреНрдпрд╛ 4096 рдмрд╛рдЗрдЯреНрд╕рд╡рд░ рдмрдлрд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рддреНрдпрд╛рдирдВрддрд░ рд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд▓рдВрдмрд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ. рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди рд╡рд╛рдЪрддрд╛рдирд╛, r0 (resp. fildes[0]) рд╡рд░ рдкрд░рдд рдЖрд▓реЗрд▓реЗ рд╣рдБрдбрд▓ рдбреЗрдЯрд╛ рдШреЗрддреЗ.
рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рд▓реЗ рдЬрд╛рддреЗ рдХреА рдПрдХрджрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рджреЛрди (рдХрд┐рдВрд╡рд╛ рдЕрдзрд┐рдХ) рд╕рдВрдкреНрд░реЗрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдХреЙрд▓рджреНрд╡рд╛рд░реЗ рддрдпрд╛рд░ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд. рдХрд╛рдЯрд╛) рдХреЙрд▓ рд╡рд╛рдкрд░реВрди рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░реЗрд▓ рд╡рд╛рдЪрд╛ ╨╕ рд▓рд┐рд╣реВ.
рд╢реЗрд▓рдордзреНрдпреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирджреНрд╡рд╛рд░реЗ рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрдЪреНрдпрд╛ рд░реЗрд╖реАрдп ре▓рд░реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдЖрд╣реЗ.
рд░рд┐рдХрд╛рдореНрдпрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди (рдХреЛрдгрддрд╛рд╣реА рдмрдлрд░ рдХреЗрд▓реЗрд▓рд╛ рдбреЗрдЯрд╛ рдирд╕рд▓реЗрд▓реНрдпрд╛) рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрд▓ рдЬреНрдпрд╛рдд рдлрдХреНрдд рдПрдХ рдЯреЛрдХ рдЖрд╣реЗ (рд╕рд░реНрд╡ рд▓реЗрдЦрди рдлрд╛рдЗрд▓ рд╡рд░реНрдгрди рдХрд░рдгрд╛рд░реЗ рдмрдВрдж рдЖрд╣реЗрдд) "рдлрд╛рдЗрд▓рдЪрд╛ рд╢реЗрд╡рдЯ" рдкрд░рдд рдХрд░рддрд╛рдд. рддрддреНрд╕рдо рдкрд░рд┐рд╕реНрдерд┐рддреАрдд рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрд▓ рджреБрд░реНрд▓рдХреНрд╖рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.
рд▓рд╡рдХрд░рд╛рдд рд▓рд╡рдХрд░
рдпреБрдирд┐рдХреНрд╕рдЪреА рд╕рд╣рд╛рд╡реА рдЖрд╡реГрддреНрддреА (1975)
рдЪрд▓рд╛ рдпреБрдирд┐рдХреНрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╡рд╛рдЪрд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛
рдЕрдиреЗрдХ рд╡рд░реНрд╖рд╛рдВрдкрд╛рд╕реВрди рдкреБрд╕реНрддрдХ рд▓рд╛рдпрдиреНрд╕ рдпреБрдирд┐рдХреНрд╕ рдХрд░реНрдирд▓рд╡рд░ рдмреЗрд▓ рд▓реЕрдмрдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдЙрдкрд▓рдмреНрдз рдЕрд╕рд▓реЗрд▓рд╛ рдПрдХрдореЗрд╡ рджрд╕реНрддрдРрд╡рдЬ рд╣реЛрддрд╛. рд╕рд╣рд╛рд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪреНрдпрд╛ рдкрд░рд╡рд╛рдиреНрдпрд╛рдиреЗ рд╢рд┐рдХреНрд╖рдХрд╛рдВрдирд╛ рддреНрдпрд╛рдЪрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджрд┐рд▓реА рдЕрд╕рд▓реА рддрд░реА, рд╕рд╛рддрд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪреНрдпрд╛ рдкрд░рд╡рд╛рдиреНрдпрд╛рдиреЗ рд╣реА рд╢рдХреНрдпрддрд╛ рд╡рдЧрд│рд▓реА, рддреНрдпрд╛рдореБрд│реЗ рдкреБрд╕реНрддрдХ рдмреЗрдХрд╛рдпрджреЗрд╢реАрд░ рдЯрдВрдХрд▓реЗрдЦрди рдкреНрд░рддреАрдВрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ.
рдЖрдЬ рддреБрдореНрд╣реА рдкреБрд╕реНрддрдХрд╛рдЪреЗ рдкреБрдирд░реНрдореБрджреНрд░рдг рдЦрд░реЗрджреА рдХрд░реВ рд╢рдХрддрд╛, рдЬреНрдпрд╛рдЪреЗ рдореБрдЦрдкреГрд╖реНрда рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдирд╛ рдХреЙрдкреА рдорд╢реАрдирд╡рд░ рджрд╛рдЦрд╡рддреЗ. рдЖрдгрд┐ рд╡реЙрд░реЗрди рдЯреВрдореАрдЪреЗ рдЖрднрд╛рд░ (рдЬреНрдпрд╛рдиреЗ TUHS рдкреНрд░рдХрд▓реНрдк рд╕реБрд░реВ рдХреЗрд▓рд╛) рдЖрдкрдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рд╢рдХрддрд╛
15 рд╡рд░реНрд╖рд╛рдВрд╣реВрди рдЕрдзрд┐рдХ рд╡рд░реНрд╖рд╛рдВрдкреВрд░реНрд╡реА, рдореА рджрд┐рд▓реЗрд▓реНрдпрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдЪреА рдПрдХ рдкреНрд░рдд рдЯрд╛рдЗрдк рдХреЗрд▓реА рд╣реЛрддреА рд▓рд╛рдпрдиреНрд╕, рдХрд╛рд░рдг рдорд▓рд╛ рдЗрддрд░ рдкреНрд░рддреАрдВрдЪреНрдпрд╛ рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпреЗрддреАрд▓ рдорд╛рдЭреНрдпрд╛ рдкреНрд░рддреАрдЪреА рдЧреБрдгрд╡рддреНрддрд╛ рдЖрд╡рдбрд▓реА рдирд╛рд╣реА. TUHS рдЕрджреНрдпрд╛рдк рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╡реНрд╣рддреЗ рдЖрдгрд┐ рдорд▓рд╛ рдЬреБрдиреНрдпрд╛ рд╕реНрддреНрд░реЛрддрд╛рдВрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдирд╡реНрд╣рддрд╛. рдкрдг 1988 рдордзреНрдпреЗ, рдорд▓рд╛ рдПрдХ рдЬреБрдиреА 9-рдЯреНрд░реЕрдХ рдЯреЗрдк рд╕рд╛рдкрдбрд▓реА рдЬреНрдпрд╛рдордзреНрдпреЗ PDP11 рд╕рдВрдЧрдгрдХрд╛рдЪрд╛ рдмреЕрдХрдЕрдк рд╣реЛрддрд╛. рддреЗ рдХрд╛рдо рдХрд░рдд рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рд╕рд╛рдВрдЧрдгреЗ рдХрдард┐рдг рд╣реЛрддреЗ, рдкрд░рдВрддреБ рдПрдХ рдЕрдЦрдВрдб /usr/src/ рдЭрд╛рдб рд╣реЛрддреЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдмрд╣реБрддреЗрдХ рдлрд╛рдИрд▓реНрд╕ 1979 рдЪреЗ рд▓реЗрдмрд▓ рд╣реЛрддреЗ, рдЬреЗ рддреЗрд╡реНрд╣рд╛рд╣реА рдкреНрд░рд╛рдЪреАрди рджрд┐рд╕рдд рд╣реЛрддреЗ. рддреА рд╕рд╛рддрд╡реА рдЖрд╡реГрддреНрддреА рд╣реЛрддреА рдХрд┐рдВрд╡рд╛ рддрд┐рдЪрд╛ рд╡реНрдпреБрддреНрдкрдиреНрди PWB рд╣реЛрддрд╛, рдорд╛рдЭреНрдпрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рдиреБрд╕рд╛рд░.
рдореА рд╢реЛрдз рдПрдХ рдЖрдзрд╛рд░ рдореНрд╣рдгреВрди рдШреЗрддрд▓рд╛ рдЖрдгрд┐ рд╕рд╣рд╛рд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрд╕рд╛рдареА рд╕реНрддреНрд░реЛрдд рд╡реНрдпрдХреНрддрд┐рдЪрд▓рд┐рддрдкрдгреЗ рд╕рдВрдкрд╛рджрд┐рдд рдХреЗрд▓реЗ. рдХрд╛рд╣реА рдХреЛрдб рд╕рд╛рд░рдЦреЗрдЪ рд░рд╛рд╣рд┐рд▓реЗ, рдкрд░рдВрддреБ рдХрд╛рд╣реАрдВрдирд╛ рдереЛрдбреЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ, рдЖрдзреБрдирд┐рдХ += рдЯреЛрдХрди рдХрд╛рд▓рдмрд╛рд╣реНрдп =+ рдордзреНрдпреЗ рдмрджрд▓реВрди. рдХрд╛рд╣реА рдЧреЛрд╖реНрдЯреА рдлрдХреНрдд рд╣рдЯрд╡рд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛, рдЖрдгрд┐ рдХрд╛рд╣реА рдкреВрд░реНрдгрдкрдгреЗ рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛, рдкрдг рдЬрд╛рд╕реНрдд рдирд╛рд╣реА.
рдЖрдгрд┐ рдЖрдЬ рдЖрдкрдг TUHS рд╡рд░ рд╕рд╣рд╛рд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдСрдирд▓рд╛рдЗрди рд╡рд╛рдЪреВ рд╢рдХрддреЛ
рддрд╕реЗ, рдкрд╣рд┐рд▓реНрдпрд╛ рджреГрд╖реНрдЯреАрдХреНрд╖реЗрдкрд╛рдд, рдХрд░реНрдирд┐рдШрди рдЖрдгрд┐ рд░рд┐рдЪреАрдЪреНрдпрд╛ рдХрд╛рд▓рд╛рд╡рдзреАрдкреВрд░реНрд╡реА рд╕реА-рдХреЛрдбрдЪреЗ рдореБрдЦреНрдп рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛рдЪреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛. рдорд╛рдЭреНрдпрд╛ рд╕рд╛рдЗрдЯрд╡рд░ рддреБрд▓рдиреЗрдиреЗ рдЕрд░реБрдВрдж рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреНрд╖реЗрддреНрд░ рдмрд╕рд╡рдгреНрдпрд╛рд╕рд╛рдареА рдореА рд╡рд┐рд╕реНрддреГрдд рд╕рдВрдкрд╛рджрдирд╛рд╢рд┐рд╡рд╛рдп рдХреЛрдбрдЪреЗ рддреБрдХрдбреЗ рдШрд╛рд▓реВ рд╢рдХрдд рдирд╛рд╣реА рдЕрд╕реЗ рд╕рд╣рд╕рд╛ рдШрдбрдд рдирд╛рд╣реА.
рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛
/*
* 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
inode (рдЬрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд░рд┐рдХрд╛рдореА рдЕрд╕реЗрд▓ рддрд░ рддреА 0 рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдЪреА рдЕрд╕реВ рд╢рдХрддреЗ) рддреНрдпрд╛рдд рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдЪрд╛ рд╢реЗрд╡рдЯ рджрд░реНрд╢рд╡рддреЛ. рд░реЗрдХреЙрд░реНрдбрд┐рдВрдЧрд╕рд╛рдареА рдкреБрд░реЗрд╢реА рдЬрд╛рдЧрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдпреЗрдереВрди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рднрд░реВ рд╢рдХрддреЛ i_size1
рддреЗ PIPESIZ
. рдордЧ рдЖрдореНрд╣реА рд▓реЙрдХ рд╕реЛрдбрддреЛ рдЖрдгрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди рд╡рд╛рдЪрдгреНрдпрд╛рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕ рдЬрд╛рдЧреГрдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЛ. рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рддрд┐рддрдХреЗ рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рд╣рд┐рддрд╛ рдЖрд▓реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╕реБрд░реБрд╡рд╛рддреАрд╕ рдкрд░рдд рдЬрд╛рддреЛ. рддреЗ рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдПрдХ рдирд╡реАрди рд░реЗрдХреЙрд░реНрдбрд┐рдВрдЧ рдЪрдХреНрд░ рд╕реБрд░реВ рдХрд░рддреЛ.
рд╕рд╣рд╕рд╛ рдкреЕрд░рд╛рдореАрдЯрд░ i_mode
inode рдкрд░рд╡рд╛рдирдЧреА рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ 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
inode рдпреЗрдереЗ. рдЖрдореНрд╣реА рд╕реНрдерд┐рддреА 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
рд▓рд┐рдирдХреНрд╕ 0.01 рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдЖрдврд│реВ рд╢рдХрддреЛ. рддреНрдпрд╛рдЪреНрдпрд╛рдордзреНрдпреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдгреЗ рдмреЛрдзрдкреНрд░рдж рдЕрд╕реЗрд▓ fs
/pipe.c
. рд╣реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ inode рд╡рд╛рдкрд░рддреЗ, рдкрд░рдВрддреБ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реНрд╡рддрдГ рдЖрдзреБрдирд┐рдХ C рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдЖрд╣реЗ. рдЬрд░ рддреБрдореНрд╣реА 6 рд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪреНрдпрд╛ рдХреЛрдбрджреНрд╡рд╛рд░реЗ рдХрд╛рдо рдХреЗрд▓реЗ рдЕрд╕реЗрд▓, рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдпреЗрдереЗ рдХреЛрдгрддрд╛рд╣реА рддреНрд░рд╛рд╕ рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА. рдлрдВрдХреНрд╢рди рдЕрд╕реЗ рджрд┐рд╕рддреЗ 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
(*BSD рд╡рд░), рдпрд╛рд╕рд╛рдареА рдЦрд░реЗ рд╕рдорд░реНрдкрдг рд▓рд╛рдЧрддреЗ. рдЖрдЬрдЪрд╛ рдХреЛрдб рд╡реЗрдХреНрдЯрд░ рдЖрдгрд┐ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ I/O рд╕рд╛рд░рдЦреНрдпрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрд╕рд╛рдареА рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдЖрдгрд┐ рд╕рдорд░реНрдерди рдпрд╛рдмрджреНрджрд▓ рдЖрд╣реЗ. рдЖрдгрд┐ рдореЗрдорд░реА рд╡рд╛рдЯрдк, рд▓реЙрдХ рдЖрдгрд┐ рдХрд░реНрдирд▓ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреЗ рддрдкрд╢реАрд▓ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдмрджрд▓рддрд╛рдд. рдкреНрд░рд╛рд╕реНрддрд╛рд╡рд┐рдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛрд░реНрд╕рд╕рд╛рдареА рдорд╣рд╛рд╡рд┐рджреНрдпрд╛рд▓рдпрд╛рдВрдирд╛ рдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА.
рдЕрд╕реЛ, рдорд▓рд╛ рдХрд╛рд╣реА рдЬреБрдиреЗ рдирдореБрдиреЗ рд╢реЛрдзрдгреНрдпрд╛рдд рд░рд╕ рд╣реЛрддрд╛ (рдЬрд╕реЗ рдХреА рдирд┐рд░реНрдорд╛рдг рдХрд░рдгреЗ SIGPIPE
рдЖрдгрд┐ рдкрд░рдд EPIPE
рдмрдВрдж рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╡рд░ рд▓рд┐рд╣рд┐рддрд╛рдирд╛) рдпрд╛ рд╕рд░реНрд╡ рднрд┐рдиреНрди рдЖрдзреБрдирд┐рдХ рдХрд░реНрдирд▓рдордзреНрдпреЗ. рдореА рдХрджрд╛рдЪрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рдирд╛рдд PDP-11 рд╕рдВрдЧрдгрдХ рдХрдзреАрдЪ рдкрд╛рд╣рдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдорд╛рдЭреНрдпрд╛ рдЬрдиреНрдорд╛рдЪреНрдпрд╛ рдХрд╛рд╣реА рд╡рд░реНрд╖рд╛рдВрдкреВрд░реНрд╡реА рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдХреЛрдбрдордзреВрди рд╢рд┐рдХрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдмрд░реЗрдЪ рдХрд╛рд╣реА рдЖрд╣реЗ.
2011 рдордзреНрдпреЗ рджрд┐рд╡реА рдХрдкреВрд░ рдпрд╛рдВрдиреА рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рд▓реЗрдЦ:
рд╕реНрддреНрд░реЛрдд: www.habr.com