เชฏเซเชจเชฟเช•เซเชธเชฎเชพเช‚ เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡

เชฏเซเชจเชฟเช•เซเชธเชฎเชพเช‚ เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡
เช† เชฒเซ‡เช– เชฏเซเชจเชฟเช•เซเชธ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡. เชนเซเช‚ เช•เช‚เชˆเช• เช…เช‚เชถเซ‡ เชจเชฟเชฐเชพเชถ เชนเชคเซ‹ เช•เซ‡ เชคเชพเชœเซ‡เชคเชฐเชจเชพ เชฒเซ‡เช– "เชฏเซเชจเชฟเช•เซเชธเชฎเชพเช‚ เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡?"เชฌเชนเชพเชฐ เช†เชตเซเชฏเซเช‚ เช›เซ‡ เชจเชฅเซ€ เช†เช‚เชคเชฐเชฟเช• เชฐเชšเชจเชพ เชตเชฟเชถเซ‡. เชนเซเช‚ เช‰เชคเซเชธเซเช• เชฌเชจเซเชฏเซ‹ เช…เชจเซ‡ เชœเชตเชพเชฌ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡ เชœเซ‚เชจเชพ เชธเซเชคเซเชฐเซ‹เชคเซ‹เชฎเชพเช‚ เช–เซ‹เชฆเซเชฏเซ‹.

เช†เชชเชฃเซ‡ เชถเซเช‚ เชตเชพเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช?

เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ, "เช•เชฆเชพเชš เชฏเซเชจเชฟเช•เซเชธเชฎเชพเช‚ เชธเซŒเชฅเซ€ เชฎเชนเชคเซเชตเชจเซ€ เชถเซ‹เชง," เช เชจเชพเชจเชพ เช•เชพเชฐเซเชฏเช•เซเชฐเชฎเซ‹เชจเซ‡ เชเช•เชธเชพเชฅเซ‡ เชœเซ‹เชกเชตเชพเชจเซ€ เช…เช‚เชคเชฐเซเช—เชค เชฏเซเชจเชฟเช•เซเชธ เชซเชฟเชฒเชธเซ‚เชซเซ€เชจเซ€ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชฒเชพเช•เซเชทเชฃเชฟเช•เชคเชพ เช›เซ‡, เชคเซ‡เชฎเชœ เช†เชฆเซ‡เชถ เชตเชพเช•เซเชฏ เชชเชฐ เชเช• เชชเชฐเชฟเชšเชฟเชค เชšเชฟเชนเซเชจ เช›เซ‡:

$ echo hello | wc -c
6

เช† เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เช•เชฐเซเชจเชฒ เชฆเซเชตเชพเชฐเชพ เชชเซ‚เชฐเซ€ เชชเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เชธเชฟเชธเซเชŸเชฎ เช•เซ‰เชฒ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ‡ เช›เซ‡ pipe, เชœเซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เชชเซƒเชทเซเช เซ‹ เชชเชฐ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡ เชชเชพเช‡เชช(7) ะธ เชชเชพเช‡เชช(2):

เชชเชพเชˆเชชเชฒเชพเชˆเชจ เช†เช‚เชคเชฐเชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชธเช‚เชšเชพเชฐ เชฎเชพเชŸเซ‡ เชเช• เชฆเชฟเชถเชพเชนเซ€เชจ เชšเซ‡เชจเชฒ เชชเซ‚เชฐเซ€ เชชเชพเชกเซ‡ เช›เซ‡. เชชเชพเช‡เชชเชฒเชพเช‡เชจเชฎเชพเช‚ เช‡เชจเชชเซเชŸ (เชเชจเซเชก เชฒเช–เซ‹) เช…เชจเซ‡ เช†เช‰เชŸเชชเซเชŸ (เชเชจเซเชก เชตเชพเช‚เชšเซ‹) เชนเซ‹เชฏ เช›เซ‡. เชชเชพเช‡เชชเชฒเชพเช‡เชจเชจเชพ เช‡เชจเชชเซเชŸ เชชเชฐ เชฒเช–เชพเชฏเซ‡เชฒ เชกเซ‡เชŸเชพ เช†เช‰เชŸเชชเซเชŸ เชชเชฐ เชตเชพเช‚เชšเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เช•เซ‹เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ pipe(2), เชœเซ‡ เชฌเซ‡ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡: เชเช• เชชเชพเช‡เชชเชฒเชพเช‡เชจเชจเชพ เช‡เชจเชชเซเชŸเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ‡ เช›เซ‡, เชฌเซ€เชœเซ‹ เช†เช‰เชŸเชชเซเชŸเชจเซ‹.

เช‰เชชเชฐเซ‹เช•เซเชค เช†เชฆเซ‡เชถเชฎเชพเช‚เชฅเซ€ เชŸเซเชฐเซ‡เชธ เช†เช‰เชŸเชชเซเชŸ เชชเชพเช‡เชชเชฒเชพเช‡เชจเชจเซ€ เชฐเชšเชจเชพ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชฆเซเชตเชพเชฐเชพ เชเช• เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚เชฅเซ€ เชฌเซ€เชœเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชกเซ‡เชŸเชพเชจเซ‹ เชชเซเชฐเชตเชพเชน เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡:

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

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

เชชเชฟเชคเซƒ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เซ‰เชฒ เช•เชฐเซ‡ เช›เซ‡ pipe()เชฎเชพเช‰เชจเซเชŸ เชฅเชฏเซ‡เชฒ เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพเช“ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡. เชเช• เชฌเชพเชณเช• เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชเช• เชนเซ‡เชจเซเชกเชฒ เชชเชฐ เชฒเช–เซ‡ เช›เซ‡, เช…เชจเซ‡ เชฌเซ€เชœเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฌเซ€เชœเชพ เชนเซ‡เชจเซเชกเชฒเชฎเชพเช‚เชฅเซ€ เชธเชฎเชพเชจ เชกเซ‡เชŸเชพ เชตเชพเช‚เชšเซ‡ เช›เซ‡. เชถเซ‡เชฒ stdin เช…เชจเซ‡ stdout เชจเซ‡ เชฎเซ‡เชš เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพ 2 เช…เชจเซ‡ 3 เชจเซ‡ "เชจเชพเชฎ เชฌเชฆเชฒเชตเชพ" เชฎเชพเชŸเซ‡ dup4 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡.

เชชเชพเชˆเชชเซ‹ เชตเชฟเชจเชพ, เชถเซ‡เชฒเชจเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ เชเช• เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ เชฒเช–เชตเซเช‚ เชชเชกเชถเซ‡ เช…เชจเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‡ เชฌเซ€เชœเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชชเชพเชธ เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡. เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชฎเซ‡ เชตเชงเซ เชธเช‚เชธเชพเชงเชจเซ‹ เช…เชจเซ‡ เชกเชฟเชธเซเช• เชœเช—เซเชฏเชพเชจเซ‹ เชฌเช—เชพเชก เช•เชฐเซ€เชถเซเช‚. เชœเซ‹ เช•เซ‡, เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ เชฎเชพเชคเซเชฐ เชเชŸเชฒเชพ เชฎเชพเชŸเซ‡ เชœ เชธเชพเชฐเซ€ เชจเชฅเซ€ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡เช“ เชคเชฎเชจเซ‡ เช…เชธเซเชฅเชพเชฏเซ€ เชซเชพเช‡เชฒเซ‹เชจเชพ เช‰เชชเชฏเซ‹เช—เชจเซ‡ เชŸเชพเชณเชตเชพ เชฆเซ‡ เช›เซ‡:

เชœเซ‹ เช•เซ‹เชˆ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช–เชพเชฒเซ€ เชชเชพเช‡เชชเชฒเชพเช‡เชจเชฎเชพเช‚เชฅเซ€ เชตเชพเช‚เชšเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€ เชฐเชนเซ€ เชนเซ‹เชฏ เชคเซ‹ read(2) เชกเซ‡เชŸเชพ เช‰เชชเชฒเชฌเซเชง เชจ เชฅเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชฌเซเชฒเซ‹เช• เช•เชฐเชถเซ‡. เชœเซ‹ เช•เซ‹เชˆ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชธเช‚เชชเซ‚เชฐเซเชฃ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชชเชฐ เชฒเช–เชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ‡ เช›เซ‡, เชคเซ‹ เชชเช›เซ€ write(2) เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เชชเชพเช‡เชชเชฒเชพเช‡เชจเชฎเชพเช‚เชฅเซ€ เชชเซ‚เชฐเชคเซ‹ เชกเซ‡เชŸเชพ เชตเชพเช‚เชšเชตเชพเชฎเชพเช‚ เชจ เช†เชตเซ‡ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชฌเซเชฒเซ‹เช• เช•เชฐเชถเซ‡.

POSIX เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเชจเซ€ เชœเซ‡เชฎ, เช† เชเช• เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช—เซเชฃเชงเชฐเซเชฎ เช›เซ‡: เชธเซเชงเซ€เชจเซ€ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชชเชฐ เชฒเช–เชตเซเช‚ PIPE_BUF เชฌเชพเช‡เชŸเซเชธ (เช“เช›เชพเชฎเชพเช‚ เช“เช›เชพ 512) เช…เชฃเซ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช เชœเซ‡เชฅเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชฆเซเชตเชพเชฐเชพ เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชเชตเซ€ เชฐเซ€เชคเซ‡ เชตเชพเชคเชšเซ€เชค เช•เชฐเซ€ เชถเช•เซ‡ เช•เซ‡ เชจเชฟเชฏเชฎเชฟเชค เชซเชพเช‡เชฒเซ‹ (เชœเซ‡ เช†เชตเซ€ เช—เซ‡เชฐเช‚เชŸเซ€ เช†เชชเชคเซ€ เชจเชฅเซ€) เช•เชฐเซ€ เชถเช•เชคเซ€ เชจเชฅเซ€.

เชจเชฟเชฏเชฎเชฟเชค เชซเชพเช‡เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชคเซ‡เชจเชพ เชคเชฎเชพเชฎ เช†เช‰เชŸเชชเซเชŸเชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชฒเช–เซ€ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฌเซ€เชœเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชชเชธเชพเชฐ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เช…เชฅเชตเชพ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“ เช…เชคเซเชฏเช‚เชค เชธเชฎเชพเช‚เชคเชฐ เชฎเซ‹เชกเชฎเชพเช‚ เช•เชพเชฐเซเชฏ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ เชฒเช–เชตเชพ เช…เชฅเชตเชพ เชตเชพเช‚เชšเชตเชพเชจเซเช‚ เชชเซ‚เชฐเซเชฃ เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชเช•เชฌเซ€เชœเชพเชจเซ‡ เชธเซ‚เชšเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฌเชพเชนเซเชฏ เชธเชฟเช—เซเชจเชฒเชฟเช‚เช— เชฎเชฟเช•เซ‡เชจเชฟเชเชฎ (เชœเซ‡เชฎ เช•เซ‡ เชธเซ‡เชฎเชพเชซเซ‹เชฐ) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เช•เชจเซเชตเซ‡เชฏเชฐ เช…เชฎเชจเซ‡ เช† เชฌเชงเซ€ เชเช‚เชเชŸเชฎเชพเช‚เชฅเซ€ เชฌเชšเชพเชตเซ‡ เช›เซ‡.

เช…เชฎเซ‡ เชถเซเช‚ เชถเซ‹เชงเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช?

เชนเซเช‚ เชคเซ‡เชจเซ‡ เชธเชฐเชณ เชถเชฌเซเชฆเซ‹เชฎเชพเช‚ เชธเชฎเชœเชพเชตเซ€เชถ เชœเซ‡เชฅเซ€ เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เช•เชจเซเชตเซ‡เชฏเชฐ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ€ เชถเช•เซ‡ เชคเซ‡เชจเซ€ เช•เชฒเซเชชเชจเชพ เช•เชฐเชตเซ€ เชธเชฐเชณ เชฌเชจเซ‡. เชคเชฎเชพเชฐเซ‡ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เชฌเชซเชฐ เช…เชจเซ‡ เช…เชฎเซเช• เชธเซเชฅเชฟเชคเชฟ เชซเชพเชณเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เชฌเชซเชฐเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เช‰เชฎเซ‡เชฐเชตเชพ เช…เชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เช•เชพเชฐเซเชฏเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เชซเชพเช‡เชฒ เชตเชฐเซเชฃเชจเช•เชฐเซเชคเชพเช“ เชชเชฐ เชตเชพเช‚เชšเชตเชพ เช…เชจเซ‡ เชฒเช–เชตเชพเชจเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชซเช‚เช•เซเชถเชจเชจเซ‡ เช•เซ‰เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชฎเชพเชงเซเชฏเชฎเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เช…เชจเซ‡ เช‰เชชเชฐ เชตเชฐเซเชฃเชตเซ‡เชฒ เชตเชฟเชถเชฟเชทเซเชŸ เชตเชฐเซเชคเชจเชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เชคเชพเชณเชพเช“เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡.

เชนเชตเซ‡ เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ เช…เชธเซเชชเชทเซเชŸ เชฎเชพเชจเชธเชฟเช• เชฎเซ‹เชกเชฒเชจเซ€ เชชเซเชทเซเชŸเชฟ เช•เชฐเชตเชพ เช…เชฅเชตเชพ เช–เซ‹เชŸเซ€ เชธเชพเชฌเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชœเชธเซเชตเซ€ เชฒเซ‡เชฎเซเชชเชฒเชพเช‡เชŸ เชนเซ‡เช เชณ เช•เชฐเซเชจเชฒ เชธเซเชฐเซ‹เชค เช•เซ‹เชกเชจเซ€ เชชเซ‚เช›เชชเชฐเช› เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เช›เซ€เช. เชชเชฐเช‚เชคเซ เชนเช‚เชฎเซ‡เชถเชพ เช…เชจเชชเซ‡เช•เซเชทเชฟเชค เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เชฐเชนเซ‹.

เช†เชชเชฃเซ‡ เช•เซเชฏเชพเช‚ เชœเซ‹เชˆ เชฐเชนเซเชฏเชพ เช›เซ€เช?

เชฎเชจเซ‡ เช–เชฌเชฐ เชจเชฅเซ€ เช•เซ‡ เชฎเชพเชฐเซ€ เชชเซเชฐเช–เซเชฏเชพเชค เชชเซเชธเซเชคเช•เชจเซ€ เชจเช•เชฒ เช•เซเชฏเชพเช‚ เช›เซ‡ "เชธเชฟเช‚เชน เชชเซเชธเซเชคเช•"เชฏเซเชจเชฟเช•เซเชธ 6 เชธเซ‹เชฐเซเชธ เช•เซ‹เชก เชธเชพเชฅเซ‡, เชชเชฐเช‚เชคเซ เช†เชญเชพเชฐ เชฏเซเชจเชฟเช•เซเชธ เชนเซ‡เชฐเชฟเชŸเซ‡เชœ เชธเซ‹เชธเชพเชฏเชŸเซ€ เชชเชฐ เชคเชฎเซ‡ เช“เชจเชฒเชพเชˆเชจ เชธเชฐเซเชš เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชก เชฏเซเชจเชฟเช•เซเชธเชจเซ€ เชœเซ‚เชจเซ€ เช†เชตเซƒเชคเซเชคเชฟเช“ เชชเชฃ.

TUHS เช†เชฐเซเช•เชพเช‡เชตเซเชธเชฎเชพเช‚ เชญเชŸเช•เชตเซเช‚ เช เชฎเซเชฏเซเชเชฟเชฏเชฎเชจเซ€ เชฎเซเชฒเชพเช•เชพเชค เชฒเซ‡เชตเชพ เชœเซ‡เชตเซเช‚ เช›เซ‡. เช†เชชเชฃเซ‡ เช†เชชเชฃเซ‹ เชธเชนเชฟเชฏเชพเชฐเซ‹ เชˆเชคเชฟเชนเชพเชธ เชœเซ‹เชˆ เชถเช•เซ€เช เช›เซ€เช เช…เชจเซ‡ เชœเซ‚เชจเซ€ เชŸเซ‡เชช เช…เชจเซ‡ เชชเซเชฐเชฟเชจเซเชŸเซเชธเชฎเชพเช‚เชฅเซ€ เช† เชฌเชงเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เชฅเซ‹เชกเซ€-เชฅเซ‹เชกเซ€-เชฅเซ‹เชกเซ€-เชฅเซ‹เชกเซ€-เชฅเซ‹เชกเซ€-เชฅเซ‹เชกเซ€-เชฅเซ‹เชกเซ€ เชตเชพเชฐเชฎเชพเช‚ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชจเชพ เช˜เชฃเชพ เชตเชฐเซเชทเซ‹เชจเชพ เชชเซเชฐเชฏเชคเซเชจเซ‹ เชฎเชพเชŸเซ‡ เชฎเชจเซ‡ เช†เชฆเชฐ เช›เซ‡. เช…เชจเซ‡ เชนเซเช‚ เชคเซ‡ เชŸเซเช•เชกเชพเช“ เชตเชฟเชถเซ‡ เชคเซ€เชตเซเชฐเชชเชฃเซ‡ เชตเชพเช•เซ‡เชซ เช›เซเช‚ เชœเซ‡ เชนเชœเซ€ เชชเชฃ เช—เซเชฎ เช›เซ‡.

เช•เชจเซเชตเซ‡เชฏเชฐเซเชธเชจเชพ เชชเซเชฐเชพเชšเซ€เชจ เช‡เชคเชฟเชนเชพเชธ เชตเชฟเชถเซ‡เชจเซ€ เช…เชฎเชพเชฐเซ€ เชœเชฟเชœเซเชžเชพเชธเชพเชจเซ‡ เชธเช‚เชคเซ‹เชทเซเชฏเชพ เชชเช›เซ€, เช…เชฎเซ‡ เชธเชฐเช–เชพเชฎเชฃเซ€ เชฎเชพเชŸเซ‡ เช†เชงเซเชจเชฟเช• เช•เชฐเซเชจเชฒเซ‹เชจเซ‡ เชœเซ‹เชˆ เชถเช•เซ€เช เช›เซ€เช.

เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, pipe เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ เชธเชฟเชธเซเชŸเชฎ เช•เซ‹เชฒ เชจเช‚เชฌเชฐ 42 เช›เซ‡ sysent[]. เชธเช‚เชฏเซ‹เช—?

เชชเชฐเช‚เชชเชฐเชพเช—เชค เชฏเซเชจเชฟเช•เซเชธ เช•เชฐเซเชจเชฒเซ‹ (1970-1974)

เชฎเชจเซ‡ เช•เซ‹เชˆ เชจเชฟเชถเชพเชจ เชฎเชณเซเชฏเชพ เชจเชฅเซ€ pipe(2) เชจ เชคเซ‹ เช…เช‚เชฆเชฐ PDP-7 เชฏเซเชจเชฟเช•เซเชธ (เชœเชพเชจเซเชฏเซเช†เชฐเซ€ 1970), เช•เซ‡ เชฎเชพเช‚ เชฏเซเชจเชฟเช•เซเชธ เชจเซ€ เชชเซเชฐเชฅเชฎ เช†เชตเซƒเชคเซเชคเชฟ (เชจเชตเซ‡เชฎเซเชฌเชฐ 1971), เชจ เชคเซ‹ เช…เชชเซ‚เชฐเซเชฃ เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชกเชฎเชพเช‚ เชฌเซ€เชœเซ€ เช†เชตเซƒเชคเซเชคเชฟ (เชœเซ‚เชจ 1972).

TUHS เชœเชฃเชพเชตเซ‡ เช›เซ‡ เช•เซ‡ เชฏเซเชจเชฟเช•เซเชธ เชจเซ€ เชคเซเชฐเซ€เชœเซ€ เช†เชตเซƒเชคเซเชคเชฟ (เชซเซ‡เชฌเซเชฐเซเช†เชฐเซ€ 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 เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชถเชฐเซ‚ เช•เชฐเซเชฏเซ‹)เชจเซ‹ เช†เชญเชพเชฐ เชคเชฎเซ‡ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช›เช เซเช เซ€ เช†เชตเซƒเชคเซเชคเชฟ เชฎเชพเชŸเซ‡ เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชก เชธเชพเชฅเซ‡ เชชเซ€เชกเซ€เชเชซ เชซเชพเช‡เชฒ. เชนเซเช‚ เชคเชฎเชจเซ‡ เชเช• เช–เซเชฏเชพเชฒ เช†เชชเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชซเชพเช‡เชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡เชŸเชฒเซ€ เชฎเชนเซ‡เชจเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡:

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 เชซเชพเช‡เชฒเซ‹ เชฎเชพเชŸเซ‡, เชคเซ‡เช“ เช…เชจเซเชฐเซ‚เชช เช›เซ‡ 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;
}

เชŸเชฟเชชเซเชชเชฃเซ€ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชตเชฐเซเชฃเชตเซ‡ เช›เซ‡ เช•เซ‡ เช…เชนเซ€เช‚ เชถเซเช‚ เชฅเชˆ เชฐเชนเซเชฏเซเช‚ เช›เซ‡. เชชเชฐเช‚เชคเซ เช•เซ‹เชกเชจเซ‡ เชธเชฎเชœเชตเซเช‚ เชเชŸเชฒเซเช‚ เชธเชฐเชณ เชจเชฅเซ€, เช†เช‚เชถเชฟเช• เชฐเซ€เชคเซ‡ เชฎเชพเชฐเซเช—เชจเซ‡ เช•เชพเชฐเชฃเซ‡ "เชธเซเชŸเซเชฐเช•เซเชšเชฐ เชฏเซเชเชฐ เชฏเซยป เช…เชจเซ‡ เชฐเชœเซ€เชธเซเชŸเชฐ 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. เชชเซเชฐเชฅเชฎ เช†เชชเชฃเซ‡ inode เชฒเซ‹เช• เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ (เชจเซ€เชšเซ‡ เชœเซเช“ plock/prele).

เชชเช›เซ€ เช…เชฎเซ‡ inode เชธเช‚เชฆเชฐเซเชญ เช•เชพเช‰เชจเซเชŸเชฐ เชคเชชเชพเชธเซ€เช เช›เซ€เช. เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชชเชพเช‡เชชเชฒเชพเช‡เชจเชจเชพ เชฌเช‚เชจเซ‡ เช›เซ‡เชกเชพ เช–เซเชฒเซเชฒเชพ เชฐเชนเซ‡ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เช•เชพเช‰เชจเซเชŸเชฐ 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

Linux 0.01 เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชก เชถเซ‹เชงเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชคเซ‡เชจเชพเชฎเชพเช‚ เชชเชพเช‡เชชเชฒเชพเช‡เชจเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเชตเซ‹ เชธเซ‚เชšเชจเชพเชคเซเชฎเช• เชฐเชนเซ‡เชถเซ‡ fs/pipe.c. เช† เชชเชพเช‡เชชเชฒเชพเช‡เชจเชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‡เชจเซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชชเซ‹เชคเซ‡ เช†เชงเซเชจเชฟเช• 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 เชเชŸเชฒเซ‹ เชเชฒเชฟเชฏเชจ เชจเชฅเซ€ เชฒเชพเช—เชคเซ‹.

เช†เชงเซเชจเชฟเช• เชฒเชฟเชจเช•เซเชธ เช•เชฐเซเชจเชฒ, เชซเซเชฐเซ€เชฌเซ€เชเชธเชกเซ€, เชจเซ‡เชŸเชฌเซ€เชเชธเชกเซ€, เช“เชชเชจเชฌเซ€เชเชธเชกเซ€

เชนเซเช‚ เชเชกเชชเชฅเซ€ เช•เซ‡เชŸเชฒเชพเช• เช†เชงเซเชจเชฟเช• เช•เชฐเซเชจเชฒเซ‹ เชฎเชพเชฐเชซเชคเซ‡ เชšเชพเชฒเซ€ เชนเชคเซ€. เชคเซ‡เชฎเชพเช‚เชจเชพ เช•เซ‹เชˆเชชเชฃ เชชเชพเชธเซ‡ เชนเชตเซ‡ เชกเชฟเชธเซเช• เช…เชฎเชฒเซ€เช•เชฐเชฃ เชจเชฅเซ€ (เช†เชถเซเชšเชฐเซเชฏเชœเชจเช• เชจเชฅเซ€). เชฒเชฟเชจเช•เซเชธเชจเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ เช›เซ‡. เชœเซ‹ เช•เซ‡ เชคเซเชฐเชฃ เช†เชงเซเชจเชฟเช• BSD เช•เชฐเซเชจเชฒเซ‹ เชœเซ‹เชจ เชกเชพเชฏเชธเชจ เชฆเซเชตเชพเชฐเชพ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เช•เซ‹เชก เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช…เชฎเชฒเซ€เช•เชฐเชฃเซ‹ เชงเชฐเชพเชตเซ‡ เช›เซ‡, เชตเชฐเซเชทเซ‹เชฅเซ€ เชคเซ‡เช“ เชเช•เชฌเซ€เชœเชพเชฅเซ€ เช–เซ‚เชฌ เชœ เช…เชฒเช— เชฅเชˆ เช—เชฏเชพ เช›เซ‡.

เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ fs/pipe.c (เชฒเชฟเชจเช•เซเชธ เชชเชฐ) เช…เชฅเชตเชพ sys/kern/sys_pipe.c (*BSD เชชเชฐ), เชคเซ‡ เชตเชพเชธเซเชคเชตเชฟเช• เชธเชฎเชฐเซเชชเชฃ เชฒเซ‡ เช›เซ‡. เช†เชœเชจเซ‹ เช•เซ‹เชก เชตเซ‡เช•เซเชŸเชฐ เช…เชจเซ‡ เช…เชธเชฟเช‚เช•เซเชฐเซ‹เชจเชธ I/O เชœเซ‡เชตเซ€ เชธเซเชตเชฟเชงเชพเช“ เชฎเชพเชŸเซ‡ เช•เชพเชฎเช—เซ€เชฐเซ€ เช…เชจเซ‡ เชธเชฎเชฐเซเชฅเชจ เชตเชฟเชถเซ‡ เช›เซ‡. เช…เชจเซ‡ เชฎเซ‡เชฎเชฐเซ€ เชซเชพเชณเชตเชฃเซ€, เชคเชพเชณเชพเช“ เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเชจเซ€ เชตเชฟเช—เชคเซ‹ เชฎเซ‹เชŸเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช‚ เชฌเชฆเชฒเชพเชฏ เช›เซ‡. เช•เซ‹เชฒเซ‡เชœเซ‹เชจเซ‡ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎ เช•เซ‹เชฐเซเชธ เชฎเชพเชŸเซ‡ เช† เชœเชฐเซ‚เชฐเซ€ เชจเชฅเซ€.

เช•เซ‹เชˆเชชเชฃ เชฐเซ€เชคเซ‡, เชฎเชจเซ‡ เช•เซ‡เชŸเชฒเซ€เช• เชœเซ‚เชจเซ€ เชชเซ‡เชŸเชฐเซเชจ เช–เซ‹เชฆเชตเชพเชฎเชพเช‚ เชฐเชธ เชนเชคเซ‹ (เชœเซ‡เชฎ เช•เซ‡ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเซเช‚ SIGPIPE เช…เชจเซ‡ เชชเชพเช›เชพ เชซเชฐเซ‹ EPIPE เชฌเช‚เชง เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชชเชฐ เชฒเช–เชคเซ€ เชตเช–เชคเซ‡) เช† เชคเชฎเชพเชฎ เชตเชฟเชตเชฟเชง เช†เชงเซเชจเชฟเช• เช•เชฐเซเชจเชฒเซ‹เชฎเชพเช‚. เชนเซเช‚ เช•เชฆเชพเชš เชตเชพเชธเซเชคเชตเชฟเช• เชœเซ€เชตเชจเชฎเชพเช‚ PDP-11 เช•เซ‹เชฎเซเชชเซเชฏเซเชŸเชฐ เช•เซเชฏเชพเชฐเซ‡เชฏ เชจเชนเซ€เช‚ เชœเซ‹เช‰เช‚, เชชเชฐเช‚เชคเซ เชฎเชพเชฐเชพ เชœเชจเซเชฎเชจเชพ เชตเชฐเซเชทเซ‹ เชชเชนเซ‡เชฒเชพ เชฒเช–เชพเชฏเซ‡เชฒเชพ เช•เซ‹เชกเชฎเชพเช‚เชฅเซ€ เชนเชœเซ เช˜เชฃเซเช‚ เชถเซ€เช–เชตเชพเชจเซเช‚ เชฌเชพเช•เซ€ เช›เซ‡.

2011 เชฎเชพเช‚ เชฆเชฟเชตเซ€ เช•เชชเซ‚เชฐ เชฆเซเชตเชพเชฐเชพ เชฒเช–เชพเชฏเซ‡เชฒ เชฒเซ‡เช–:เชชเชพเช‡เชชเซเชธ เช…เชจเซ‡ FIFOs เชจเซเช‚ Linux เช•เชฐเซเชจเชฒ เช…เชฎเชฒเซ€เช•เชฐเชฃ" Linux เชฎเชพเช‚ เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ (เชนเชœเซ เชชเชฃ) เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเซ€ เชเชพเช‚เช–เซ€ เช†เชชเซ‡ เช›เซ‡. เช Linux เชฎเชพเช‚ เชคเชพเชœเซ‡เชคเชฐเชจเซ€ เชชเซเชฐเชคเชฟเชฌเชฆเซเชงเชคเชพ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเชจเชพ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชฎเซ‹เชกเซ‡เชฒเชจเซ‡ เชธเชฎเชœเชพเชตเซ‡ เช›เซ‡, เชœเซ‡เชจเซ€ เช•เซเชทเชฎเชคเชพเช“ เช…เชธเซเชฅเชพเชฏเซ€ เชซเชพเช‡เชฒเซ‹เชจเซ€ เช•เซเชทเชฎเชคเชพ เช•เชฐเชคเชพเช‚ เชตเชงเซ€ เชœเชพเชฏ เช›เซ‡; เช…เชจเซ‡ เช›เช เซเช เซ€ เช†เชตเซƒเชคเซเชคเชฟ เชฏเซเชจเชฟเช•เซเชธ เช•เชฐเซเชจเชฒเชจเซ€ "เช–เซ‚เชฌ เชœ เชฐเซ‚เชขเชฟเชšเซเชธเซเชค เชฒเซ‹เช•เซ€เช‚เช—" เชฅเซ€ เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธ เช•เซ‡เชŸเชฒเซ€ เชฆเซ‚เชฐ เช†เชตเซ€ เช›เซ‡ เชคเซ‡ เชชเชฃ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹