рдпреБрдирд┐рдХреНрд╕рдордзреНрдпреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╢рд╛ рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд

рдпреБрдирд┐рдХреНрд╕рдордзреНрдпреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╢рд╛ рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд
рд╣рд╛ рд▓реЗрдЦ рдпреБрдирд┐рдХреНрд╕ рдХрд░реНрдирд▓рдордзреАрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЛ. рдореА рдХрд╛рд╣реАрд╕рд╛ рдирд┐рд░рд╛рд╢ рдЭрд╛рд▓реЛ рдХреА рдЕрд▓реАрдХрдбреАрд▓ рд▓реЗрдЦ "рдпреБрдирд┐рдХреНрд╕рдордзреНрдпреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд?"рдмрд╛рд╣реЗрд░ рдкрдбрд▓реЗ рдирд╛рд╣реА рдЕрдВрддрд░реНрдЧрдд рд░рдЪрдирд╛ рдмрджреНрджрд▓. рдореА рдЙрддреНрд╕реБрдХ рдЭрд╛рд▓реЛ рдЖрдгрд┐ рдЙрддреНрддрд░ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рдЬреБрдиреНрдпрд╛ рд╕реНрддреНрд░реЛрддрд╛рдВрдЪрд╛ рд╢реЛрдз рдШреЗрддрд▓рд╛.

рдЖрдореНрд╣реА рдХрд╢рд╛рдмрджреНрджрд▓ рдмреЛрд▓рдд рдЖрд╣реЛрдд?

рдкрд╛рдЗрдкрд▓рд╛рдЗрди, "рдХрджрд╛рдЪрд┐рдд рдпреБрдирд┐рдХреНрд╕рдордзреАрд▓ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рд╢реЛрдз," рд╣реЗ рд▓рд╣рд╛рди рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдирд╛ рдПрдХрддреНрд░ рдЬреЛрдбрдгреНрдпрд╛рдЪреНрдпрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдпреБрдирд┐рдХреНрд╕ рддрддреНрддреНрд╡рдЬреНрдЮрд╛рдирд╛рдЪреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЖрд╣реЗ, рддрд╕реЗрдЪ рдХрдорд╛рдВрдб рд▓рд╛рдЗрдирд╡рд░реАрд▓ рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдЪрд┐рдиреНрд╣ рдЖрд╣реЗ:

$ 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) рдЕрдгреВ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реВрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирджреНрд╡рд╛рд░реЗ рдПрдХрдореЗрдХрд╛рдВрд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзреВ рд╢рдХрддреАрд▓ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рдирд┐рдпрдорд┐рдд рдлрд╛рдЗрд▓реНрд╕ (рдЬреНрдпрд╛ рдЕрд╢реА рд╣рдореА рджреЗрдд тАЛтАЛрдирд╛рд╣реАрдд) рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реАрдд.

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

рдЖрдореНрд╣реА рдХрд╛рдп рд╢реЛрдзрдд рдЖрд╣реЛрдд?

рдореА рддреЗ рд╕реЛрдкреНрдпрд╛ рднрд╛рд╖реЗрдд рд╕рдордЬрд╛рд╡реВрди рд╕рд╛рдВрдЧреЗрди рдЬреЗрдгреЗрдХрд░реВрди рдХрдиреНрд╡реНрд╣реЗрдпрд░ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░реВ рд╢рдХрддреЗ рдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░рдгреЗ рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рд╕реЛрдкреЗ рд╣реЛрдИрд▓. рддреБрдореНрд╣рд╛рд▓рд╛ рдореЗрдорд░реАрдордзреНрдпреЗ рдмрдлрд░ рдЖрдгрд┐ рдХрд╛рд╣реА рд░рд╛рдЬреНрдп рд╡рд╛рдЯрдк рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓. рдмрдлрд░рдордзреВрди рдбреЗрдЯрд╛ рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдХрд╛рдврдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓. рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕рд╡рд░ рд╡рд╛рдЪрди рдЖрдгрд┐ рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рдиреНрд╕ рджрд░рдореНрдпрд╛рди рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рд╣реА рд╕рд╛рдзрдирд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓. рдЖрдгрд┐ рд╡рд░ рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрддрдирд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рд▓реЙрдХрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓.

рдЖрддрд╛ рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рдорд╛рдирд╕рд┐рдХ рдореЙрдбреЗрд▓рдЪреА рдкреБрд╖реНрдЯреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ рдЦреЛрдЯреЗ рдард░рд╡рдгреНрдпрд╛рд╕рд╛рдареА рддреЗрдЬрд╕реНрд╡реА рджрд┐рд╡реНрдпрд╛рдЦрд╛рд▓реА рдХрд░реНрдирд▓ рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдЪреА рдЪреМрдХрд╢реА рдХрд░рдгреНрдпрд╛рд╕ рддрдпрд╛рд░ рдЖрд╣реЛрдд. рдкрд░рдВрддреБ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЧреЛрд╖реНрдЯреАрдВрд╕рд╛рдареА рдиреЗрд╣рдореА рддрдпрд╛рд░ рд░рд╣рд╛.

рдЖрдореНрд╣реА рдХреБрдареЗ рдмрдШрддреЛрдп?

рдорд╛рдЭреНрдпрд╛ рдкреНрд░рд╕рд┐рджреНрдз рдкреБрд╕реНрддрдХрд╛рдЪреА рдкреНрд░рдд рдХреБрдареЗ рдЖрд╣реЗ рд╣реЗ рдорд▓рд╛ рдорд╛рд╣реАрдд рдирд╛рд╣реА "рд▓рд╛рдпрдиреНрд╕ рдмреБрдХ"рдпреБрдирд┐рдХреНрд╕ 6 рд╕реНрддреНрд░реЛрдд рдХреЛрдбрд╕рд╣, рдкрд░рдВрддреБ рдзрдиреНрдпрд╡рд╛рдж рдпреБрдирд┐рдХреНрд╕ рд╣реЗрд░рд┐рдЯреЗрдЬ рд╕реЛрд╕рд╛рдпрдЯреА рдпреЗрдереЗ рдСрдирд▓рд╛рдЗрди рд╢реЛрдзреВ рд╢рдХрддрд╛ рдореВрд│ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджрдХреЛрд╢ рдпреБрдирд┐рдХреНрд╕рдЪреНрдпрд╛ рдЕрдЧрджреА рдЬреБрдиреНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛.

TUHS рдЖрд░реНрдХрд╛рдЗрд╡реНрд╣рдЬрдордзреВрди рднрдЯрдХрдгреЗ рдореНрд╣рдгрдЬреЗ рдПрдЦрд╛рджреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣рд╛рд▓рдпрд╛рд▓рд╛ рднреЗрдЯ рджреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ. рдЖрдореНрд╣реА рдЖрдордЪрд╛ рд╕рд╛рдорд╛рдпрд┐рдХ рдЗрддрд┐рд╣рд╛рд╕ рдкрд╛рд╣реВ рд╢рдХрддреЛ рдЖрдгрд┐ рдЬреБрдиреНрдпрд╛ рдЯреЗрдкреНрд╕ рдЖрдгрд┐ рдкреНрд░рд┐рдВрдЯреНрд╕рдордзреВрди рд╣реЗ рд╕рд░реНрд╡ рд╕рд╛рд╣рд┐рддреНрдп рдкрд░рдд рдорд┐рд│рд╡рдгреНрдпрд╛рдЪреНрдпрд╛ рдЕрдиреЗрдХ рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдкреНрд░рдпрддреНрдирд╛рдВрдмрджреНрджрд▓ рдорд▓рд╛ рдЖрджрд░ рдЖрд╣реЗ. рдЖрдгрд┐ рдЕрдЬреВрдирд╣реА рд╣рд░рд╡рд▓реЗрд▓реНрдпрд╛ рддреБрдХрдбреНрдпрд╛рдВрдмрджреНрджрд▓ рдорд▓рд╛ рддреАрд╡реНрд░рддреЗрдиреЗ рдЬрд╛рдгреАрд╡ рдЖрд╣реЗ.

рдХрдиреНрд╡реНрд╣реЗрдпрд░реНрд╕рдЪреНрдпрд╛ рдкреНрд░рд╛рдЪреАрди рдЗрддрд┐рд╣рд╛рд╕рд╛рдмрджреНрджрд▓рдЪреА рдЖрдордЪреА рдЙрддреНрд╕реБрдХрддрд╛ рдкреВрд░реНрдг рдХреЗрд▓реНрдпрд╛рд╡рд░, рдЖрдореНрд╣реА рддреБрд▓рдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдзреБрдирд┐рдХ рдХрд░реНрдирд▓ рдкрд╛рд╣реВ рд╢рдХрддреЛ.

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

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

рдорд▓рд╛ рдХрд╛рд╣реА рдЦреБрдгрд╛ рд╕рд╛рдкрдбрд▓реНрдпрд╛ рдирд╛рд╣реАрдд pipe(2) рдордзреНрдпреЗ рдирд╛рд╣реА PDP-7 Unix (рдЬрд╛рдиреЗрд╡рд╛рд░реА 1970), рдХрд┐рдВрд╡рд╛ рдордзреНрдпреЗ рдпреБрдирд┐рдХреНрд╕рдЪреА рдкрд╣рд┐рд▓реА рдЖрд╡реГрддреНрддреА (рдиреЛрд╡реНрд╣реЗрдВрдмрд░ 1971), рдХрд┐рдВрд╡рд╛ рдЕрдкреВрд░реНрдг рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдордзреНрдпреЗ рджреБрд╕рд░реА рдЖрд╡реГрддреНрддреА (рдЬреВрди резрепренреи).

рдЯреАрдпреВрдПрдЪрдПрд╕ рдореНрд╣рдгрддреЗ рдХреА рдпреБрдирд┐рдХреНрд╕рдЪреА рддрд┐рд╕рд░реА рдЖрд╡реГрддреНрддреА (рдлреЗрдмреНрд░реБрд╡рд╛рд░реА 1973) рдХрдиреНрд╡реНрд╣реЗрдпрд░реНрд╕рд╕рд╣ рдкрд╣рд┐рд▓реА рдЖрд╡реГрддреНрддреА рдмрдирд▓реА:

рдпреБрдирд┐рдХреНрд╕ 1973рд░реА рдЖрд╡реГрддреНрддреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖реЗрдд рд▓рд┐рд╣рд┐рд▓реЗрд▓реА рдХрд░реНрдирд▓ рдЕрд╕рд▓реЗрд▓реА рд╢реЗрд╡рдЯрдЪреА рдЖрд╡реГрддреНрддреА рд╣реЛрддреА, рдкрд░рдВрддреБ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╕рд╣ рдкрд╣рд┐рд▓реА рдЖрд╡реГрддреНрддреА рджреЗрдЦреАрд▓ рд╣реЛрддреА. XNUMX рдЪреНрдпрд╛ рджрд░рдореНрдпрд╛рди, рддрд┐рд╕рд░реА рдЖрд╡реГрддреНрддреА рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдп рдХреЗрд▓реЗ рдЧреЗрд▓реЗ, рдХрд░реНрдирд▓ C рдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рд▓рд╛ рдЧреЗрд▓рд╛ рдЖрдгрд┐ рдореНрд╣рдгреВрди рдпреБрдирд┐рдХреНрд╕рдЪреА рдЪреМрдереА рдЖрд╡реГрддреНрддреА рдЖрд▓реА.

рдПрдХрд╛ рд╡рд╛рдЪрдХрд╛рд▓рд╛ рдПрдХрд╛ рджрд╕реНрддрдРрд╡рдЬрд╛рдЪреЗ рд╕реНрдХреЕрди рд╕рд╛рдкрдбрд▓реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдбрдЧ рдореЕрдХрд┐рд▓рд░реЙрдпрдиреЗ "рдЧрд╛рд░реНрдбрди рд╣реЛрдЬрд╕рд╛рд░рдЦреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрдиреЗрдХреНрдЯ рдХрд░рдгреЗ" рдЪреА рдХрд▓реНрдкрдирд╛ рдорд╛рдВрдбрд▓реА.

рдпреБрдирд┐рдХреНрд╕рдордзреНрдпреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╢рд╛ рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд
рдмреНрд░рд╛рдпрди рдХрд░реНрдирд┐рдШрди рдпрд╛рдВрдЪреНрдпрд╛ рдкреБрд╕реНрддрдХрд╛рддрдпреБрдирд┐рдХреНрд╕: рдПрдХ рдЗрддрд┐рд╣рд╛рд╕ рдЖрдгрд┐ рдПрдХ рд╕рдВрд╕реНрдорд░рдг", рдХрдиреНрд╡реНрд╣реЗрдпрд░реНрд╕рдЪреНрдпрд╛ рдЙрджрдпрд╛рдЪреНрдпрд╛ рдЗрддрд┐рд╣рд╛рд╕рд╛рдд, рдпрд╛ рджрд╕реНрддрдРрд╡рдЬрд╛рдЪрд╛ рджреЗрдЦреАрд▓ рдЙрд▓реНрд▓реЗрдЦ рдЖрд╣реЗ: "... рддреЗ рдорд╛рдЭреНрдпрд╛ рдмреЗрд▓ рд▓реЕрдмрдордзреАрд▓ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдд 30 рд╡рд░реНрд╖рд╛рдВрдкрд╛рд╕реВрди рднрд┐рдВрддреАрд╡рд░ рд▓рдЯрдХрд▓реЗ рд╣реЛрддреЗ." рдпреЗрдереЗ McIlroy рд╕рд╣ рдореБрд▓рд╛рдЦрдд, рдЖрдгрд┐ рдХрдбреВрди рджреБрд╕рд░реА рдХрдерд╛ рдореЕрдХреНрдЗрд▓рд░реЙрдпрдЪреЗ рдХрд╛рд░реНрдп, 2014 рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ:

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

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

рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рдпреБрдирд┐рдХреНрд╕ рдХрд░реНрдирд▓рдЪреНрдпрд╛ рддрд┐рд╕рд▒реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдЧрдорд╛рд╡рд▓рд╛ рдЖрд╣реЗ. рдЖрдгрд┐ рдЬрд░реА рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХрд░реНрдирд▓ рд╕реЛрд░реНрд╕ рдХреЛрдб C рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ рдЪреМрдереА рдЖрд╡реГрддреНрддреА, рдиреЛрд╡реНрд╣реЗрдВрдмрд░ 1973 рдордзреНрдпреЗ рд░рд┐рд▓реАрдЭ рдЭрд╛рд▓реЗ, рдкрд░рдВрддреБ рддреЗ рдЕрдзрд┐рдХреГрдд рдкреНрд░рдХрд╛рд╢рдирд╛рдЪреНрдпрд╛ рдХрд┐рддреНрдпреЗрдХ рдорд╣рд┐рдиреЗ рдЖрдзреА рдЖрд▓реЗ рдЖрдгрд┐ рддреНрдпрд╛рдд рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдирд╛рд╣реА. рдпрд╛ рдкреМрд░рд╛рдгрд┐рдХ рдпреБрдирд┐рдХреНрд╕ рдлрдВрдХреНрд╢рдирдЪрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдХрджрд╛рдЪрд┐рдд рдХрд╛рдпрдордЪрд╛ рдЧрдорд╛рд╡рд▓рд╛ рд╣реА рд▓рд╛рдЬрд┐рд░рд╡рд╛рдгреА рдЧреЛрд╖реНрдЯ рдЖрд╣реЗ.

рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдордЬрдХреВрд░ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдЖрд╣реЗ pipe(2) рджреЛрдиреНрд╣реА рд░рд┐рд▓реАрдЭрдордзреВрди, рдЬреЗрдгреЗрдХрд░реВрди рддреБрдореНрд╣реА рджрд╕реНрддрдРрд╡рдЬ рд╢реЛрдзреВрди рдкреНрд░рд╛рд░рдВрдн рдХрд░реВ рд╢рдХрддрд╛ рддрд┐рд╕рд░реА рдЖрд╡реГрддреНрддреА (рдХрд╛рд╣реА рд╢рдмреНрджрд╛рдВрд╕рд╛рдареА, рдЕрдзреЛрд░реЗрдЦрд┐рдд тАЬрдореЕрдиреНрдпреБрдЕрд▓реАтАЭ, рдЕрдХреНрд╖рд░рд╛рдВрдЪреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ ^H, рддреНрдпрд╛рдирдВрддрд░ рдЕрдВрдбрд░рд╕реНрдХреЛрд░!). рд╣рд╛ рдкреНрд░реЛрдЯреЛ-pipe(2) рдЕрд╕реЗрдВрдмрд▓реА рднрд╛рд╖реЗрдд рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдлрдХреНрдд рдПрдХ рдлрд╛рдЗрд▓ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдкрд░рдд рдХрд░рддреЗ, рдкрд░рдВрддреБ рдЖрдзреАрдЪ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЛрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ:

рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд╛рдИрдк рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдирд╛рд╡рд╛рдЪреА рдЗрдирдкреБрдЯ/рдЖрдЙрдЯрдкреБрдЯ рдпрдВрддреНрд░рдгрд╛ рддрдпрд╛рд░ рдХрд░рддреЗ. рд░рд┐рдЯрд░реНрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░рдЪрд╛ рд╡рд╛рдкрд░ рд╡рд╛рдЪрди рдЖрдгрд┐ рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рдиреНрд╕рд╕рд╛рдареА рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ. рдЬреЗрд╡реНрд╣рд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╡рд░ рдХрд╛рд╣реАрддрд░реА рд▓рд┐рд╣рд┐рд▓реЗ рдЬрд╛рддреЗ, рддреЗрд╡реНрд╣рд╛ 504 рдмрд╛рдЗрдЯреНрд╕рдкрд░реНрдпрдВрдд рдбреЗрдЯрд╛ рдмрдлрд░ рдХреЗрд▓рд╛ рдЬрд╛рддреЛ, рддреНрдпрд╛рдирдВрддрд░ рд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд▓рдВрдмрд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ. рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди рд╡рд╛рдЪрддрд╛рдирд╛, рдмрдлрд░ рдХреЗрд▓реЗрд▓рд╛ рдбреЗрдЯрд╛ рдХрд╛рдвреВрди рдШреЗрддрд▓рд╛ рдЬрд╛рддреЛ.

рдкреБрдвреАрд▓ рд╡рд░реНрд╖реА рдХрд░реНрдирд▓ C рдордзреНрдпреЗ рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рд▓рд╛ рдЧреЗрд▓рд╛ рд╣реЛрддрд╛, рдЖрдгрд┐ рдкрд╛рдИрдк(2) рдЪреМрдереНрдпрд╛ рдЖрд╡реГрддреНрддреАрдд рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкрд╕рд╣ рддреНрдпрд╛рдЪреЗ рдЖрдзреБрдирд┐рдХ рд╕реНрд╡рд░реВрдк рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ "pipe(fildes)"

рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд╛рдИрдк рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдирд╛рд╡рд╛рдЪреА рдЗрдирдкреБрдЯ/рдЖрдЙрдЯрдкреБрдЯ рдпрдВрддреНрд░рдгрд╛ рддрдпрд╛рд░ рдХрд░рддреЗ. рд░рд┐рдЯрд░реНрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрд╛рдЗрд▓рдЪреЗ рд╡рд░реНрдгрди рд╡рд╛рдЪрди рдЖрдгрд┐ рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рдиреНрд╕рдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ. рдЬреЗрд╡реНрд╣рд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╡рд░ рдХрд╛рд╣реАрддрд░реА рд▓рд┐рд╣рд┐рд▓реЗ рдЬрд╛рддреЗ, рддреЗрд╡реНрд╣рд╛ r1 (resp. fildes[1]) рдордзреНрдпреЗ рдкрд░рдд рдЖрд▓реЗрд▓реЗ рд╣рдБрдбрд▓ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ, рдбреЗрдЯрд╛рдЪреНрдпрд╛ 4096 рдмрд╛рдЗрдЯреНрд╕рд╡рд░ рдмрдлрд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рддреНрдпрд╛рдирдВрддрд░ рд▓реЗрдЦрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд▓рдВрдмрд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ. рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди рд╡рд╛рдЪрддрд╛рдирд╛, r0 (resp. fildes[0]) рд╡рд░ рдкрд░рдд рдЖрд▓реЗрд▓реЗ рд╣рдБрдбрд▓ рдбреЗрдЯрд╛ рдШреЗрддреЗ.

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

рд╢реЗрд▓рдордзреНрдпреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирджреНрд╡рд╛рд░реЗ рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрдЪреНрдпрд╛ рд░реЗрд╖реАрдп ре▓рд░реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдЖрд╣реЗ.

рд░рд┐рдХрд╛рдореНрдпрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди (рдХреЛрдгрддрд╛рд╣реА рдмрдлрд░ рдХреЗрд▓реЗрд▓рд╛ рдбреЗрдЯрд╛ рдирд╕рд▓реЗрд▓реНрдпрд╛) рд╡рд╛рдЪрдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрд▓ рдЬреНрдпрд╛рдд рдлрдХреНрдд рдПрдХ рдЯреЛрдХ рдЖрд╣реЗ (рд╕рд░реНрд╡ рд▓реЗрдЦрди рдлрд╛рдЗрд▓ рд╡рд░реНрдгрди рдХрд░рдгрд╛рд░реЗ рдмрдВрдж рдЖрд╣реЗрдд) "рдлрд╛рдЗрд▓рдЪрд╛ рд╢реЗрд╡рдЯ" рдкрд░рдд рдХрд░рддрд╛рдд. рддрддреНрд╕рдо рдкрд░рд┐рд╕реНрдерд┐рддреАрдд рд▓рд┐рд╣рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрд▓ рджреБрд░реНрд▓рдХреНрд╖рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.

рд▓рд╡рдХрд░рд╛рдд рд▓рд╡рдХрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╕рдВрджрд░реНрднрд┐рдд рдпреБрдирд┐рдХреНрд╕рдЪреНрдпрд╛ рдкрд╛рдЪрд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдд (рдЬреВрди 1974), рдкрд░рдВрддреБ рдкреБрдвреАрд▓ рд░рд┐рд▓реАрдЭрдордзреНрдпреЗ рджрд┐рд╕рд▓реЗрд▓реНрдпрд╛ рдПрдХрд╕рд╛рд░рдЦреЗрдЪ рдЖрд╣реЗ. рдЯрд┐рдкреНрдкрдгреНрдпрд╛ рдиреБрдХрддреНрдпрд╛рдЪ рдЬреЛрдбрд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд, рддреНрдпрд╛рдореБрд│реЗ рддреБрдореНрд╣реА рдкрд╛рдЪрд╡реА рдЖрд╡реГрддреНрддреА рд╡рдЧрд│реВ рд╢рдХрддрд╛.

рдпреБрдирд┐рдХреНрд╕рдЪреА рд╕рд╣рд╛рд╡реА рдЖрд╡реГрддреНрддреА (1975)

рдЪрд▓рд╛ рдпреБрдирд┐рдХреНрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╡рд╛рдЪрд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛ рд╕рд╣рд╛рд╡реА рдЖрд╡реГрддреНрддреА (рдореЗ 1975). рдпрд╛рдВрдЪреЗ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ рдЖрднрд╛рд░ рд▓рд╛рдпрдиреНрд╕ рдкреВрд░реНрд╡реАрдЪреНрдпрд╛ рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕реНрддреНрд░реЛрддрд╛рдВрдкреЗрдХреНрд╖рд╛ рддреЗ рд╢реЛрдзрдгреЗ рдЦреВрдк рд╕реЛрдкреЗ рдЖрд╣реЗ:

рдЕрдиреЗрдХ рд╡рд░реНрд╖рд╛рдВрдкрд╛рд╕реВрди рдкреБрд╕реНрддрдХ рд▓рд╛рдпрдиреНрд╕ рдпреБрдирд┐рдХреНрд╕ рдХрд░реНрдирд▓рд╡рд░ рдмреЗрд▓ рд▓реЕрдмрдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдЙрдкрд▓рдмреНрдз рдЕрд╕рд▓реЗрд▓рд╛ рдПрдХрдореЗрд╡ рджрд╕реНрддрдРрд╡рдЬ рд╣реЛрддрд╛. рд╕рд╣рд╛рд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪреНрдпрд╛ рдкрд░рд╡рд╛рдиреНрдпрд╛рдиреЗ рд╢рд┐рдХреНрд╖рдХрд╛рдВрдирд╛ рддреНрдпрд╛рдЪрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджрд┐рд▓реА рдЕрд╕рд▓реА рддрд░реА, рд╕рд╛рддрд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪреНрдпрд╛ рдкрд░рд╡рд╛рдиреНрдпрд╛рдиреЗ рд╣реА рд╢рдХреНрдпрддрд╛ рд╡рдЧрд│рд▓реА, рддреНрдпрд╛рдореБрд│реЗ рдкреБрд╕реНрддрдХ рдмреЗрдХрд╛рдпрджреЗрд╢реАрд░ рдЯрдВрдХрд▓реЗрдЦрди рдкреНрд░рддреАрдВрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ.

рдЖрдЬ рддреБрдореНрд╣реА рдкреБрд╕реНрддрдХрд╛рдЪреЗ рдкреБрдирд░реНрдореБрджреНрд░рдг рдЦрд░реЗрджреА рдХрд░реВ рд╢рдХрддрд╛, рдЬреНрдпрд╛рдЪреЗ рдореБрдЦрдкреГрд╖реНрда рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдирд╛ рдХреЙрдкреА рдорд╢реАрдирд╡рд░ рджрд╛рдЦрд╡рддреЗ. рдЖрдгрд┐ рд╡реЙрд░реЗрди рдЯреВрдореАрдЪреЗ рдЖрднрд╛рд░ (рдЬреНрдпрд╛рдиреЗ TUHS рдкреНрд░рдХрд▓реНрдк рд╕реБрд░реВ рдХреЗрд▓рд╛) рдЖрдкрдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реВ рд╢рдХрддрд╛ рд╕рд╣рд╛рд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрд╕рд╛рдареА рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдЕрд╕рд▓реЗрд▓реА PDF рдлрд╛рдЗрд▓. рдлрд╛рдЗрд▓ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд┐рддреА рдкреНрд░рдпрддреНрди рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдпрд╛рдЪреА рдорд▓рд╛ рдХрд▓реНрдкрдирд╛ рджреНрдпрд╛рдпрдЪреА рдЖрд╣реЗ:

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

рдореА рд╢реЛрдз рдПрдХ рдЖрдзрд╛рд░ рдореНрд╣рдгреВрди рдШреЗрддрд▓рд╛ рдЖрдгрд┐ рд╕рд╣рд╛рд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрд╕рд╛рдареА рд╕реНрддреНрд░реЛрдд рд╡реНрдпрдХреНрддрд┐рдЪрд▓рд┐рддрдкрдгреЗ рд╕рдВрдкрд╛рджрд┐рдд рдХреЗрд▓реЗ. рдХрд╛рд╣реА рдХреЛрдб рд╕рд╛рд░рдЦреЗрдЪ рд░рд╛рд╣рд┐рд▓реЗ, рдкрд░рдВрддреБ рдХрд╛рд╣реАрдВрдирд╛ рдереЛрдбреЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ, рдЖрдзреБрдирд┐рдХ += рдЯреЛрдХрди рдХрд╛рд▓рдмрд╛рд╣реНрдп =+ рдордзреНрдпреЗ рдмрджрд▓реВрди. рдХрд╛рд╣реА рдЧреЛрд╖реНрдЯреА рдлрдХреНрдд рд╣рдЯрд╡рд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛, рдЖрдгрд┐ рдХрд╛рд╣реА рдкреВрд░реНрдгрдкрдгреЗ рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛, рдкрдг рдЬрд╛рд╕реНрдд рдирд╛рд╣реА.

рдЖрдгрд┐ рдЖрдЬ рдЖрдкрдг TUHS рд╡рд░ рд╕рд╣рд╛рд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪрд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдб рдСрдирд▓рд╛рдЗрди рд╡рд╛рдЪреВ рд╢рдХрддреЛ рд╕рдВрдЧреНрд░рд╣рдг, рдЬреНрдпрд╛рдордзреНрдпреЗ рдбреЗрдирд┐рд╕ рд░рд┐рдЪреАрдЪрд╛ рд╣рд╛рдд рд╣реЛрддрд╛.

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

рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ /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 рдлрд╛рдЗрд▓реНрд╕рд╕рд╛рдареА, рддреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗрдд рдЗрдиреЛрдб рдзреНрд╡рдЬ рдореЛрдард╛, рдЬреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА "рдореЛрдареНрдпрд╛ ре▓рдбреНрд░реЗрд╕рд┐рдВрдЧ рдЕрд▓реНрдЧреЛрд░рд┐рджрдо" рджреНрд╡рд╛рд░реЗ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдмреНрд▓реЙрдХреНрд╕ рдореЛрдареНрдпрд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдорд▓рд╛ рд╕рдорд░реНрдерди рджреЗрдгреНрдпрд╛рд╕рд╛рдареА. рддреНрдпрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рди рдХрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ рдЕрд╕реЗ рдХреЗрдирдиреЗ рдореНрд╣рдЯрд▓реНрдпрд╛рдореБрд│реЗ, рдореА рдЖрдирдВрджрд╛рдиреЗ рддреНрдпрд╛рдЪрд╛ рд╢рдмреНрдж рд╕реНрд╡реАрдХрд╛рд░рддреЛ.

рдпреЗрдереЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЖрд╣реЗ 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;
}

рдЯрд┐рдкреНрдкрдгреА рдпреЗрдереЗ рдХрд╛рдп рдЪрд╛рд▓рд▓реЗ рдЖрд╣реЗ рдпрд╛рдЪреЗ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ. рдкрд░рдВрддреБ рдХреЛрдб рд╕рдордЬрдгреЗ рдЗрддрдХреЗ рд╕реЛрдкреЗ рдирд╛рд╣реА, рдЕрдВрд╢рддрдГ рдорд╛рд░реНрдЧрд╛рдореБрд│реЗ "рд░рдЪрдирд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ u┬╗ рдЖрдгрд┐ рдиреЛрдВрджрдгреА R0 ╨╕ R1 рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдЖрдгрд┐ рд░рд┐рдЯрд░реНрди рд╡реНрд╣реЕрд▓реНрдпреВ рдкрд╛рд╕ рдХреЗрд▓реА рдЬрд╛рддрд╛рдд.

рд╕рд╣ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛ ialloc() рдбрд┐рд╕реНрдХрд╡рд░ рдареЗрд╡рд╛ inode (рдЗрдВрдбреЗрдХреНрд╕ рд╣рдБрдбрд▓), рдЖрдгрд┐ рдорджрддреАрдиреЗ falloc() - рд╕реНрдореГрддреАрдордзреНрдпреЗ рджреЛрди рдареЗрд╡рд╛ рдлрд╛рдЗрд▓. рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░рд╛рд╣рд┐рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдпрд╛ рдлрд╛рдЗрд▓реНрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдЪреЗ рджреЛрди рдЯреЛрдХ рдореНрд╣рдгреВрди рдУрд│рдЦрдгреНрдпрд╛рд╕рд╛рдареА рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░реВ, рддреНрдпрд╛рдВрдирд╛ рддреНрдпрд╛рдЪ рдЗрдиреЛрдбрдХрдбреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реВ (рдЬреНрдпрд╛рдВрдЪреА рд╕рдВрджрд░реНрдн рд╕рдВрдЦреНрдпрд╛ 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 inode (рдЬрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд░рд┐рдХрд╛рдореА рдЕрд╕реЗрд▓ рддрд░ рддреА 0 рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдЪреА рдЕрд╕реВ рд╢рдХрддреЗ) рддреНрдпрд╛рдд рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдЪрд╛ рд╢реЗрд╡рдЯ рджрд░реНрд╢рд╡рддреЛ. рд░реЗрдХреЙрд░реНрдбрд┐рдВрдЧрд╕рд╛рдареА рдкреБрд░реЗрд╢реА рдЬрд╛рдЧрд╛ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдпреЗрдереВрди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рднрд░реВ рд╢рдХрддреЛ i_size1 рддреЗ PIPESIZ. рдордЧ рдЖрдореНрд╣реА рд▓реЙрдХ рд╕реЛрдбрддреЛ рдЖрдгрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреВрди рд╡рд╛рдЪрдгреНрдпрд╛рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдкреНрд░рдХреНрд░рд┐рдпреЗрд╕ рдЬрд╛рдЧреГрдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЛ. рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рддрд┐рддрдХреЗ рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рд╣рд┐рддрд╛ рдЖрд▓реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╕реБрд░реБрд╡рд╛рддреАрд╕ рдкрд░рдд рдЬрд╛рддреЛ. рддреЗ рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣реА рдПрдХ рдирд╡реАрди рд░реЗрдХреЙрд░реНрдбрд┐рдВрдЧ рдЪрдХреНрд░ рд╕реБрд░реВ рдХрд░рддреЛ.

рд╕рд╣рд╕рд╛ рдкреЕрд░рд╛рдореАрдЯрд░ i_mode inode рдкрд░рд╡рд╛рдирдЧреА рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ r, w ╨╕ x. рдкрд░рдВрддреБ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдЖрдореНрд╣реА рд╕рд┐рдЧреНрдирд▓ рдХрд░рддреЛ рдХреА рдХрд╛рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд┐рдЯ рд╡рд╛рдкрд░реВрди рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рдХрд┐рдВрд╡рд╛ рд╡рд╛рдЪрдгреНрдпрд╛рдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдд рдЖрд╣реЗ IREAD ╨╕ IWRITE рдЕрдиреБрдХреНрд░рдореЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдзреНрд╡рдЬ рдЖрдгрд┐ рдХреЙрд▓ рд╕реЗрдЯ рдХрд░рддреЗ sleep(), рдЖрдгрд┐ рднрд╡рд┐рд╖реНрдпрд╛рдд рдЗрддрд░ рдХрд╛рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рд░рдгреАрднреВрдд рдард░рддреАрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ рдЖрд╣реЗ wakeup().

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬрд╛рджреВ рдордзреНрдпреЗ рдШрдбрддреЗ sleep() ╨╕ wakeup(). рдордзреНрдпреЗ рддреНрдпрд╛рдВрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рдХреЗрд▓реА рдЬрд╛рддреЗ slp.c, рдкреНрд░рд╕рд┐рджреНрдз тАЬрддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рд╕рдордЬрдгреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╛рд╣реАтАЭ рдЯрд┐рдкреНрдкрдгреАрдЪрд╛ рд╕реНрд░реЛрдд. рд╕реБрджреИрд╡рд╛рдиреЗ, рдЖрдореНрд╣рд╛рд▓рд╛ рдХреЛрдб рд╕рдордЬрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА, рдлрдХреНрдд рдХрд╛рд╣реА рдЯрд┐рдкреНрдкрдгреНрдпрд╛ рдкрд╣рд╛:

/*
 * 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(), рдЬреЗрд╡реНрд╣рд╛ рддреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╡рд░ рдХрд╛рд╣реА рдбреЗрдЯрд╛ рд▓рд┐рд╣рд┐рддреЗ.

рд╡рд░ рдЯрд┐рдкреНрдкрдгреНрдпрд╛ readi() рдЖрдгрд┐ writei() рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рд╕рдордЬрдгреНрдпрд╛рд╕ рдорджрдд рдХрд░реЗрд▓ рдХреА "рдорд╛рд░реНрдЧреЗ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкрд╛рд╕ рдХрд░рдгреНрдпрд╛рдРрд╡рдЬреА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 рдкреНрд░реЛрд╕реЗрд╕рд░рд╡рд░ рдЪрд╛рд▓рдгреНрдпрд╛рд╕рд╛рдареА рддреЗ рдЖрдзреБрдирд┐рдХ C рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗ. рдХреЛрдб рд╡рд╛рдЪрдгреНрдпрд╛рд╕ рд╕реЛрдкрд╛ рдЖрдгрд┐ рд╕рдордЬрдгреНрдпрд╛рд╕рд╛рд░рдЦрд╛ рдЖрд╣реЗ. рд╢рд┐рд╡рд╛рдп, TUHS рд╕рд╣ рдпреБрдирд┐рдХреНрд╕ рд╕реНрддреНрд░реЛрддрд╛рдВрдЪреНрдпрд╛ рд╡рд┐рдкрд░реАрдд, рддреБрдореНрд╣реА рддреЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реВ рд╢рдХрддрд╛, рддреНрдпрд╛рдд рд╕реБрдзрд╛рд░рдгрд╛ рдХрд░реВ рд╢рдХрддрд╛ рдЖрдгрд┐ PDP 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

рд▓рд┐рдирдХреНрд╕ 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 рдордзреНрдпреЗ рджрд┐рд╡реА рдХрдкреВрд░ рдпрд╛рдВрдиреА рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рд▓реЗрдЦ:рдкрд╛рдИрдкреНрд╕ рдЖрдгрд┐ FIFOs рдЪреА рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдирд▓ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА" Linux рдордзреНрдпреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди (рдЕрдЬреВрдирд╣реА) рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рдпрд╛рдЪреЗ рд╡рд┐рд╣рдВрдЧрд╛рд╡рд▓реЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ. рдП рд▓рд┐рдирдХреНрд╕ рдордзреНрдпреЗ рдЕрд▓реАрдХрдбреАрд▓ рдХрдорд┐рдЯ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рдЪреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЙрдбреЗрд▓ рджрд░реНрд╢рд╡рддреЗ, рдЬреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рддрд╛рддреНрдкреБрд░рддреНрдпрд╛ рдлрд╛рдЗрд▓реНрд╕рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЖрд╣реЗ; рдЖрдгрд┐ рдпреБрдирд┐рдХреНрд╕ рдХрд░реНрдирд▓рдЪреНрдпрд╛ рд╕рд╣рд╛рд╡реНрдпрд╛ рдЖрд╡реГрддреНрддреАрдЪреНрдпрд╛ "рдЕрддреНрдпрдВрдд рдкреБрд░рд╛рдгрдорддрд╡рд╛рджреА рд▓реЙрдХрд┐рдВрдЧ" рдкрд╛рд╕реВрди рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд┐рддреА рджреВрд░ рдЖрд▓реНрдпрд╛ рдЖрд╣реЗрдд рд╣реЗ рджреЗрдЦреАрд▓ рджрд░реНрд╢рд╡рд┐рддреЗ.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛