рдХрд╕рд░реА рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╣рд░реВ Unix рдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдиреНрдЫ

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

рд╣рд╛рдореА рдХреЗ рдХреБрд░рд╛ рдЧрд░реНрджреИрдЫреМрдВ?

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

$ 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 рдорд┐рд▓рд╛рдЙрди рд╡рд░реНрдгрдирдХрд░реНрддрд╛ 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), рди рдд рдЕрдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдбрдорд╛ рджреЛрд╕реНрд░реЛ рд╕рдВрд╕реНрдХрд░рдг (рдЬреБрди резрепренреи)ред

TUHS рд▓реЗ рдЬрдирд╛рдПрдХреЛ рдЫ рдпреБрдирд┐рдХреНрд╕ рдХреЛ рддреЗрд╕реНрд░реЛ рд╕рдВрд╕реНрдХрд░рдг (рдлреЗрдмреНрд░реБрдЕрд░реА 1973) рдХрдиреНрд╡реЗрдпрд░рд╣рд░реВрдХреЛ рд╕рд╛рде рдкрд╣рд┐рд▓реЛ рд╕рдВрд╕реНрдХрд░рдг рдмрдиреНрдпреЛ:

Unix 1973rd рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдзрд╛рдирд╕рднрд╛ рднрд╛рд╖рд╛рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдХрд░реНрдиреЗрд▓рдХреЛ рд╕рд╛рде рдЕрдиреНрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдерд┐рдпреЛ, рддрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╣рд░реВ рд╕рд╣рд┐рддрдХреЛ рдкрд╣рд┐рд▓реЛ рд╕рдВрд╕реНрдХрд░рдг рдкрдирд┐ рдерд┐рдпреЛред XNUMX рдХреЛ рд╕рдордпрдорд╛, рддреЗрд╕реНрд░реЛ рд╕рдВрд╕реНрдХрд░рдг рд╕реБрдзрд╛рд░ рдЧрд░реНрди рдХрд╛рдо рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рдХрд░реНрдиреЗрд▓ рд╕реА рдорд╛ рдкреБрди: рд▓реЗрдЦрд┐рдПрдХреЛ рдерд┐рдпреЛ, рд░ рдпрд╕реИрд▓реЗ Unix рдХреЛ рдЪреМрдереЛ рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦрд╛ рдкрд░реНрдпреЛред

рдПрдХ рдкрд╛рдардХрд▓реЗ рдХрд╛рдЧрдЬрд╛рддрдХреЛ рд╕реНрдХреНрдпрд╛рди рдлреЗрд▓рд╛ рдкрд╛рд░реЗ рдЬрд╕рдорд╛ рдбрдЧ рдореНрдпрд╛рдХрдЗрд▓реНрд░реЛрдпрд▓реЗ "рдЧрд╛рд░реНрдбреЗрди рд╣реЛрдЬ рдЬрд╕реНрддреИ рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рдЬрдбрд╛рди рдЧрд░реНрдиреЗ" рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд░реЗред

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

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

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

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

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

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

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

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

рдпреЛ рдорд╛рдирд┐рдиреНрдЫ рдХрд┐ рдПрдХ рдкрдЯрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рднрдПрдкрдЫрд┐, рджреБрдИ (рд╡рд╛ рдмрдвреА) рд╕рдЮреНрдЪрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ (рдкрдЫрд┐рд▓реНрд▓реЛ рдХрд▓рд╣рд░реВрджреНрд╡рд╛рд░рд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛред рдлреЛрд░реНрдХ) рдХрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдмрд╛рдЯ рдбрд╛рдЯрд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗрдЫ рдкрдвреНрдиреБрд╣реЛрд╕ ╨╕ рд▓реЗрдЦреНрди.

рд╢реЗрд▓рд╕рдБрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирджреНрд╡рд╛рд░рд╛ рдЬрдбрд╛рди рдЧрд░рд┐рдПрдХрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВрдХреЛ рд░реИрдЦрд┐рдХ рдПрд░реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЫред

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

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

рдпреБрдирд┐рдХреНрд╕рдХреЛ рдЫреИрдЯреМрдВ рд╕рдВрд╕реНрдХрд░рдг (резрепренрел)

рдпреБрдирд┐рдХреНрд╕ рд╕реНрд░реЛрдд рдХреЛрдб рдкрдвреНрди рд╕реБрд░реБ рдЧрд░реМрдВ рдЫреИрдЯреМрдВ рд╕рдВрд╕реНрдХрд░рдг (рдореЗ резрепренрел)ред рдзреЗрд░реИ рд╣рджрд╕рдореНрдо рдзрдиреНрдпрд╡рд╛рдж рд╕рд┐рдВрд╣ рдпреЛ рдкрд╣рд┐рд▓реЗрдХреЛ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрд░реЛрддрд╣рд░реБ рднрдиреНрджрд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рдЫ:

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

рдЖрдЬ рддрдкрд╛рдИрдВрд▓реЗ рдкреБрд╕реНрддрдХрдХреЛ рдкреБрди: рдкреНрд░рд┐рдиреНрдЯ рдХрд┐рдиреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЬрд╕рдХреЛ рдЖрд╡рд░рдгрд▓реЗ рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВрд▓рд╛рдИ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдореЗрд╕рд┐рдирдорд╛ рджреЗрдЦрд╛рдЙрдБрдЫред рд░ рд╡рд╛рд░реЗрди рдЯреБрдореАрд▓рд╛рдИ рдзрдиреНрдпрд╡рд╛рдж (рдЬрд╕рд▓реЗ TUHS рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реБрд░реБ рдЧрд░реНрдиреБрднрдпреЛ) рддрдкрд╛рдИрдВрд▓реЗ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЫреИрдЯреМрдВ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрд░реЛрдд рдХреЛрдбрдХреЛ рд╕рд╛рде PDF рдлрд╛рдЗрд▓ред рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдХрддрд┐ рдкреНрд░рдпрд╛рд╕ рдЧрдпреЛ рднрдиреНрдиреЗ рдПрдХ рд╡рд┐рдЪрд╛рд░ рджрд┐рди рдЪрд╛рд╣рдиреНрдЫреБ:

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

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

рд░ рдЖрдЬ рд╣рд╛рдореА TUHS рдорд╛ рдЫреИрдЯреМрдВ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдЕрдирд▓рд╛рдЗрди рдкрдвреНрди рд╕рдХреНрдЫреМрдВ рдЕрднрд┐рд▓реЗрдЦ, рдЬрд╕рдорд╛ рдбреЗрдирд┐рд╕ рд░рд┐рдЪреАрдХреЛ рд╣рд╛рдд рдерд┐рдпреЛ.

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

рд╕реБрд░реБрдорд╛ /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 рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рддрд┐рдиреАрд╣рд░реВ рдЕрдиреБрд░реВрдк рдЫрдиреН inode рдЭрдгреНрдбрд╛ 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 рдорд╛ рд╕реЗрдЯ рдЧрд░рд┐рдиреЗ рдЫ), рд░ рдЖрдЗрдиреЛрдбрд▓рд╛рдИ рдкрд░рд┐рдорд╛рд░реНрдЬрд┐рдд рд░ рдкреНрд░рдпреЛрдЧрдорд╛ рдЪрд┐рдиреНрд╣ рд▓рдЧрд╛рдЙрдиреБрд╣реЛрд╕реНред рдЕрдиреБрд░реЛрдзрд╣рд░реВрдорд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН iput() рдирдпрд╛рдБ inode рдорд╛ рд╕рдиреНрджрд░реНрдн рдЧрдгрдирд╛ рдХрдо рдЧрд░реНрди рддреНрд░реБрдЯрд┐ рдорд╛рд░реНрдЧрд╣рд░реВрдорд╛ред

pipe() рдорд╛рд░реНрдлрдд рдЧрд░реНрдиреБрдкрд░реНрдЫ R0 ╨╕ R1 рдкрдвреНрди рд░ рд▓реЗрдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдлрд╛рдЗрд▓ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдирдореНрдмрд░рд╣рд░реВ рдлрд░реНрдХрд╛рдЙрдиреБрд╣реЛрд╕реНред falloc() рдлрд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛рдорд╛ рд╕реВрдЪрдХ рдлрд░реНрдХрд╛рдЙрдБрдЫ, рддрд░ рдорд╛рд░реНрдлрдд "рдлрд┐рд░реНрддрд╛" рдкрдирд┐ рдЧрд░реНрдЫ u.u_ar0[R0] рд░ рдлрд╛рдЗрд▓ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ред рддреНрдпреЛ рд╣реЛ, рдХреЛрдб рднрд┐рддреНрд░ рдмрдЪрдд рд╣реБрдиреНрдЫ r рдкрдвреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдлрд╛рдЗрд▓ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд░ рд╕рд┐рдзреИ рд▓реЗрдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдлрд╛рдЗрд▓ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рдирд┐рдпреБрдХреНрдд рдЧрд░реНрджрдЫ u.u_ar0[R0] рджреЛрд╕реНрд░реЛ рдХрд▓ рдкрдЫрд┐ falloc().

рдлреНрд▓реНрдпрд╛рдЧ FPIPE, рдЬреБрди рд╣рд╛рдореАрд▓реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛ рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВ, рдкреНрд░рдХрд╛рд░реНрдпрдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрджрдЫ rdwr() sys2.c рдорд╛рд╡рд┐рд╢рд┐рд╖реНрдЯ 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).

рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА inode рд╕рдиреНрджрд░реНрдн рдХрд╛рдЙрдиреНрдЯрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрдЫреМрдВред рдЬрдмрд╕рдореНрдо рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдХреЛ рджреБрд╡реИ рдЫреЗрдЙ рдЦреБрд▓рд╛ рд░рд╣рдиреНрдЫ, рдХрд╛рдЙрдиреНрдЯрд░ 2 рдмрд░рд╛рдмрд░ рд╣реБрдиреБрдкрд░реНрдЫред рд╣рд╛рдореАрд▓реЗ рдПрдЙрдЯрд╛ рд▓рд┐рдЩреНрдХ (рдмрд╛рдЯ rp->f_inode), рддреНрдпрд╕реИрд▓реЗ рдпрджрд┐ рдХрд╛рдЙрдиреНрдЯрд░ реи рднрдиреНрджрд╛ рдХрдо рдЫ рднрдиреЗ, рдпрд╕рдХреЛ рдЕрд░реНрде рдкрдвреНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдХреЛ рдЕрдиреНрддреНрдп рдмрдиреНрдж рдЧрд░реЗрдХреЛ рд╣реБрдиреБрдкрд░реНрдЫред рдЕрд░реНрдХреЛ рд╢рдмреНрджрдорд╛, рд╣рд╛рдореА рдмрдиреНрдж рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдорд╛ рд▓реЗрдЦреНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИрдЫреМрдВ, рд░ рдпреЛ рддреНрд░реБрдЯрд┐ рд╣реЛред рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб 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 рдорд╛ред рд╣рд╛рдореАрд▓реЗ рд╕реНрдерд┐рддрд┐рд▓рд╛рдИ реж рдорд╛ рд░рд┐рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВ рд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдорд╛ рд▓реЗрдЦреНрди рдЪрд╛рд╣рдиреЗ рдХреБрдиреИ рдкрдирд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдЬрдЧрд╛рдЙрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдЫреМрдВред рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдЬрдм рдХрдиреНрд╡реЗрдпрд░ рднрд░рд┐рдиреНрдЫ, 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() рдЪрдХреНрд░ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрдЫред

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

Unix рдХреЛ рд╕рд╛рддреМрдВ рд╕рдВрд╕реНрдХрд░рдг (рдЬрдирд╡рд░реА 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

рд▓рд┐рдирдХреНрд╕ реж.режрез рд╕реНрд░реЛрдд рдХреЛрдб рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫред рдЙрд╣рд╛рдБрдорд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдзреНрдпрдпрди рдЧрд░реНрди рдирд┐рд░реНрджреЗрд╢рдирд╛рддреНрдордХ рд╣реБрдиреЗрдЫ fs/pipe.cред рдпрд╕рд▓реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд▓рд╛рдИ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЗрдиреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ, рддрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЖрдлреИрдВрдорд╛ рдЖрдзреБрдирд┐рдХ C рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ XNUMX рдФрдВ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рдХреЛрдб рдорд╛рд░реНрдлрдд рдЖрдлреНрдиреЛ рддрд░рд┐рдХрд╛рд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдпрд╣рд╛рдБ рдХреБрдиреИ рд╕рдорд╕реНрдпрд╛ рд╣реБрдиреЗрдЫреИрдиред рдпреЛ рдкреНрд░рдХрд╛рд░реНрдп рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ 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 рддреНрдпрддрд┐ рд╡рд┐рджреЗрд╢реА рджреЗрдЦрд┐рджреИрди ред

рдЖрдзреБрдирд┐рдХ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓, FreeBSD, NetBSD, OpenBSD

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

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

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

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди