เบงเบดเบ—เบตเบเบฒเบ™เบ—เปเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™ Unix

เบงเบดเบ—เบตเบเบฒเบ™เบ—เปเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™ Unix
เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ—เปเปˆเปƒเบ™ Unix kernel. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบœเบดเบ”โ€‹เบซเบงเบฑเบ‡โ€‹เบšเบฒเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เบ—เบตเปˆโ€‹เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ—เบตเปˆโ€‹เบœเปˆเบฒเบ™โ€‹เบกเบฒโ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบซเบปเบงโ€‹เบ‚เปเป‰โ€‹เบงเปˆเบฒ ".เบ—เปเปˆเป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”เปƒเบ™ Unix?ยป เบซเบฑเบ™เบญเบญเบ เบšเปเปˆ เบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบฒเบเปƒเบ™. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบขเบฒเบโ€‹เบฎเบนเป‰โ€‹เบชเบถเบโ€‹เบขเบฒเบโ€‹เป€เบซเบฑเบ™โ€‹เปเบฅเบฐโ€‹เป„เบ”เป‰โ€‹เบ‚เบธเบ”โ€‹เบ„เบปเป‰เบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เปเบซเบผเปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เป€เบเบปเปˆเบฒโ€‹เป€เบžเบทเปˆเบญโ€‹เบŠเบญเบโ€‹เบซเบฒโ€‹เบ„เปเบฒโ€‹เบ•เบญเบš.

เบžเบงเบเป€เบฎเบปเบฒเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบซเบเบฑเบ‡?

เบ—เปเปˆเปเบกเปˆเบ™ "เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบ›เบฐเบ”เบดเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”เปƒเบ™ Unix" - เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เบ‚เบญเบ‡เบ›เบฑเบ”เบŠเบฐเบเบฒเบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡ Unix เปƒเบ™เบเบฒเบ™เบงเบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบฎเปˆเบงเบกเบเบฑเบ™, เปเบฅเบฐเบ„เปเบฒเบ‚เบงเบฑเบ™เบ‚เบญเบ‡เป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเบ„เบธเป‰เบ™เป€เบ„เบตเบ:

$ echo hello | wc -c
6

เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เบ‚เบถเป‰เบ™เบเบฑเบšเบเบฒเบ™เป€เบญเบตเป‰เบ™เบฅเบฐเบšเบปเบšเบ—เบตเปˆเปƒเบซเป‰ kernel 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()เป€เบžเบทเปˆเบญเป€เบญเบปเบฒเบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเป„เบŸเบฅเปŒเบ—เบตเปˆเบ•เบดเบ”เบ„เบฑเบ”เบกเบฒ. เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบฅเบนเบเปœเบถเปˆเบ‡เบ‚เบฝเบ™เปƒเบชเปˆเบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเปœเบถเปˆเบ‡ เปเบฅเบฐเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบทเปˆเบ™เบญเปˆเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ”เบฝเบงเบเบฑเบ™เบˆเบฒเบเบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเบญเบทเปˆเบ™. เปเบเบฐ "เบ›เปˆเบฝเบ™เบŠเบทเปˆ" เบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบ 2 เปเบฅเบฐ 3 เบ”เป‰เบงเบ dup4 เป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบปเบ‡เบเบฑเบš stdin เปเบฅเบฐ stdout.

เป‚เบ”เบเบšเปเปˆเบกเบตเบ—เปเปˆ, เปเบเบฐเบˆเบฐเบ•เป‰เบญเบ‡เบ‚เบฝเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบซเบ™เบถเปˆเบ‡เป„เบ›เบซเบฒเป„เบŸเบฅเปŒเปเบฅเบฐเบ—เปเปˆเบกเบฑเบ™เป„เบ›เบซเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบทเปˆเบ™เป€เบžเบทเปˆเบญเบญเปˆเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเป„เบŸเบฅเปŒ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบชเบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ เปเบฅเบฐเบžเบทเป‰เบ™เบ—เบตเปˆเบ”เบดเบชเบเปŒเบซเบผเบฒเบเบ‚เบถเป‰เบ™. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ—เปเปˆเปเบกเปˆเบ™เบ”เบตเบชเปเบฒเบฅเบฑเบšเบซเบผเบฒเบเบเปˆเบงเบฒเบžเบฝเบ‡เปเบ•เปˆเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เป„เบŸเบฅเปŒเบŠเบปเปˆเบงเบ„เบฒเบง:

เบ–เป‰เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเบญเปˆเบฒเบ™เบˆเบฒเบเบ—เปเปˆเป€เบ›เบปเปˆเบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ read(2) เบˆเบฐเบšเบฅเบฑเบญเบเบˆเบปเบ™เบเบงเปˆเบฒเบ‚เปเป‰เบกเบนเบ™เบˆเบฐเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰. เบ–เป‰เบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบžเบฐเบเบฒเบเบฒเบกเบ‚เบฝเบ™เปƒเบชเปˆเบ—เปเปˆเป€เบ•เบฑเบก, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ write(2) เบˆเบฐเบ›เบดเบ”เบเบฑเป‰เบ™เบˆเบปเบ™เบเปˆเบงเบฒเบ‚เปเป‰เบกเบนเบ™เบžเบฝเบ‡เบžเปเป„เบ”เป‰เบ–เบทเบเบญเปˆเบฒเบ™เบˆเบฒเบเบ—เปเปˆเป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เบ‚เบฝเบ™.

เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ‚เปเป‰เบเปเบฒเบ™เบปเบ” POSIX, เบ™เบตเป‰เปเบกเปˆเบ™เบŠเบฑเบšเบชเบดเบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™: เบเบฒเบ™เบ‚เบฝเบ™เป„เบ›เบซเบฒเบ—เปเปˆเป€เบ–เบดเบ‡ PIPE_BUF bytes (เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ 512) เบˆเบฐเบ•เป‰เบญเบ‡เป€เบ›เบฑเบ™เบ›เบฐเบฅเปเบฒเบกเบฐเบ™เบนเป€เบžเบทเปˆเบญเปƒเบซเป‰เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเบเบฑเบ™เปเบฅเบฐเบเบฑเบ™เป‚เบ”เบเบœเปˆเบฒเบ™เบ—เปเปˆเปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเป„เบŸเบฅเปŒเบ›เบปเบเบเบฐเบ•เบด (เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง) เบšเปเปˆเบชเบฒเบกเบฒเบ”.

เบ”เป‰เบงเบเป„เบŸเบฅเปŒเบ›เบปเบเบเบฐเบ•เบด, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ‚เบญเบ‡เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบซเป‰เบเบฑเบšเบกเบฑเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบ•เปเปˆเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบทเปˆเบ™. เบซเบผเบทเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ•เปˆเบฒเบ‡เป†เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบฐเบซเบ™เบฒเบ™เบเบฒเบ, เป‚เบ”เบเปƒเบŠเป‰เบเบปเบ™เป„เบเบเบฒเบ™เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™เบžเบฒเบเบ™เบญเบ (เป€เบŠเบฑเปˆเบ™ Semalt) เป€เบžเบทเปˆเบญเปเบˆเป‰เบ‡เปƒเบซเป‰เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เบ‚เบฝเบ™เบซเบผเบทเบญเปˆเบฒเบ™. conveyors เบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เบžเบงเบเป€เบฎเบปเบฒเบˆเบฒเบเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰.

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบŠเบญเบเบซเบฒเบซเบเบฑเบ‡?

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบเปˆเบฝเบงเบเบฑเบšเบ™เบดเป‰เบงเบกเบทเบ‚เบญเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™เบ—เบตเปˆเบˆเบฐเบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบฅเปเบฒเบฅเบฝเบ‡เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰. เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบˆเบฑเบ”เบชเบฑเบ™ buffer เปเบฅเบฐเบšเบฒเบ‡เบฅเบฑเบ”เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ. เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบก เปเบฅเบฐเบฅเบถเบšเบ‚เปเป‰เบกเบนเบ™เบญเบญเบเบˆเบฒเบเบšเบฑเบŸเป€เบŸเบต. เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบดเปˆเบ‡เบญเปเบฒเบ™เบงเบเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบเบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบžเบทเปˆเบญเป€เบญเบตเป‰เบ™เบŸเบฑเบ‡เบŠเบฑเบ™เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบญเปˆเบฒเบ™ เปเบฅเบฐเบ‚เบฝเบ™เปƒเบ™เบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเป„เบŸเบฅเปŒ. เปเบฅเบฐ locks เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เป€เบžเบทเปˆเบญเบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบถเบ”เบ•เบดเบเปเบฒเบžเบดเป€เบชเบ”เบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡.

เบ”เบฝเบงเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเบชเบญเบšเบ–เบฒเบกเบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เปเบเปˆเบ™เบžเบฒเบเปƒเบ•เป‰เป‚เบ„เบกเป„เบŸเบ—เบตเปˆเบชเบปเบ”เปƒเบชเป€เบžเบทเปˆเบญเบขเบทเบ™เบขเบฑเบ™เบซเบผเบทเบ›เบฐเบ•เบดเป€เบชเบ”เบ•เบปเบงเปเบšเบšเบ—เบฒเบ‡เบˆเบดเบ”เบ—เบตเปˆเบšเปเปˆเบˆเบฐเปเบˆเป‰เบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เปเบ•เปˆเบชเบฐเป€เบซเบกเบตเบเบฝเบกเบžเป‰เบญเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเปเปˆเบ„เบฒเบ”เบ„เบดเบ”.

เบžเบงเบเป€เบฎเบปเบฒเบŠเบญเบเบซเบฒเบขเบนเปˆเปƒเบช?

เบ‚เป‰เบญเบเบšเปเปˆเบฎเบนเป‰เบงเปˆเบฒเบชเบณเป€เบ™เบปเบฒเบ›เบถเป‰เบกเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบชเบฝเบ‡เบ‚เบญเบ‡เบ‚เป‰เบญเบเบขเบนเปˆเปƒเบช.เบ›เบทเป‰เบกเบšเบฑเบ™เบ—เบถเบเบŠเป‰เบฒเบ‡ยซ เบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡ Unix 6, เปเบ•เปˆเบ‚เปเบ‚เบญเบšเปƒเบˆ เบชเบฐเบกเบฒเบ„เบปเบกเบกเปเบฅเบฐเบ”เบปเบ Unix เบชเบฒเบกเบฒเบ”เบ„เบปเป‰เบ™เบซเบฒเบญเบญเบ™เป„เบฅเบ™เปŒ เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡ เปเบกเป‰เปเบ•เปˆเบฅเบธเป‰เบ™เป€เบเบปเปˆเบฒเบ‚เบญเบ‡ Unix.

เบเบฒเบ™เบเปˆเบฒเบ‡เบœเปˆเบฒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™ TUHS เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบšเบเบฒเบ™เป„เบ›เบขเป‰เบฝเบกเบขเบฒเบกเบžเบดเบžเบดเบ—เบฐเบžเบฑเบ™. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”เบฎเปˆเบงเบกเบเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบฅเบฐเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบกเบตเบ„เบงเบฒเบกเป€เบ„เบปเบฒเบฅเบปเบšเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบซเบผเบฒเบเบ›เบตเบ—เบตเปˆเบˆเบฐเบŸเบทเป‰เบ™เบ•เบปเบงเป€เบญเบเบฐเบชเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เป€เบ—เบทเปˆเบญเบฅเบฐเบซเบ™เป‰เบญเบเบˆเบฒเบ cassettes เป€เบเบปเปˆเบฒเปเบฅเบฐเบžเบดเบกเบญเบญเบ. เปเบฅเบฐเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบฎเบนเป‰เบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡เบเปˆเบฝเบงเบเบฑเบšเบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ—เบตเปˆเบเบฑเบ‡เบ‚เบฒเบ”เบซเบฒเบเป„เบ›.

เป‚เบ”เบเบžเปเปƒเบˆเบเบฑเบšเบ„เบงเบฒเบกเบขเบฒเบเบฎเบนเป‰เบขเบฒเบเป€เบซเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบเปˆเบฝเบงเบเบฑเบšเบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”เบšเบนเบฎเบฒเบ™เบ‚เบญเบ‡เบ—เปเปˆ, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เปเบเบ™เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบš.

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, pipe เปเบกเปˆเบ™เบฅเบฐเบšเบปเบšเบเบฒเบ™เป‚เบ—เป€เบฅเบ 42 เปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡ sysent[]. เบšเบฑเบ‡เป€เบญเบตเบ™?

เปเบเปˆเบ™ Unix เปเบšเบšเบ”เบฑเป‰เบ‡เป€เบ”เบตเบก (1970-1974)

เบ‚เป‰เบญเบเบšเปเปˆเบžเบปเบšเบฎเปˆเบญเบ‡เบฎเบญเบเปƒเบ”เป† pipe(2) เบšเปเปˆเบขเบนเปˆเปƒเบ™ PDP-7 Unix (เป€เบ”เบทเบญเบ™เบกเบฑเบ‡เบเบญเบ™ 1970), เบซเบผเบทเปƒเบ™ Unix เบชเบฐเบšเบฑเบšเบ—เปเบฒเบญเบดเบ” (เป€เบ”เบทเบญเบ™เบžเบฐเบˆเบดเบ 1971), เบซเบผเบทเบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ—เบตเปˆเบšเปเปˆเบ„เบปเบšเบ–เป‰เบงเบ™ เบชเบฐเบšเบฑเบšเบ—เบตเบชเบญเบ‡ (เป€เบ”เบทเบญเบ™เบกเบดเบ–เบธเบ™เบฒ 1972).

TUHS เบญเป‰เบฒเบ‡เบงเปˆเบฒ Unix เบชเบฐเบšเบฑเบšเบ—เบตเบชเบฒเบก (เป€เบ”เบทเบญเบ™เบเบธเบกเบžเบฒ 1973) เปเบกเปˆเบ™เบชเบฐเบšเบฑเบšเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบกเบตเบ—เปเปˆ:

เบชเบฐเบšเบฑเบšเบ—เบตเบชเบฒเบกเบ‚เบญเบ‡ Unix เปเบกเปˆเบ™เบชเบฐเบšเบฑเบšเบชเบธเบ”เบ—เป‰เบฒเบเบ—เบตเปˆเบกเบต kernel เบ‚เบฝเบ™เปƒเบ™เบ•เบปเบงเบ›เบฐเบเบญเบš, เปเบ•เปˆเบเบฑเบ‡เป€เบ›เบฑเบ™เบชเบฐเบšเบฑเบšเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบกเบตเบ—เปเปˆ. เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ›เบต 1973, เบงเบฝเบเบ‡เบฒเบ™เบเปเบฒเบฅเบฑเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เป€เบžเบทเปˆเบญเบ›เบฑเบšเบ›เบธเบ‡เบชเบฐเบšเบฑเบšเบ—เบตเบชเบฒเบก, kernel เป„เบ”เป‰เบ–เบทเบเบ‚เบฝเบ™เบ„เบทเบ™เปƒเบซเบกเปˆเปƒเบ™ C, เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบชเบฐเบšเบฑเบšเบ—เบตเบชเบตเปˆเบ‚เบญเบ‡ Unix เป„เบ”เป‰เป€เบเบตเบ”เบกเบฒ.

เบœเบนเป‰เบญเปˆเบฒเบ™เบ„เบปเบ™เบซเบ™เบถเปˆเบ‡เป„เบ”เป‰เบžเบปเบšเป€เบซเบฑเบ™เบเบฒเบ™เบชเบฐเปเบเบ™เป€เบญเบเบฐเบชเบฒเบ™เบ—เบตเปˆ Doug McIlroy เบชเบฐเป€เบซเบ™เบตเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡ "เป‚เบ„เบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป€เบŠเบฑเปˆเบ™เบ—เปเปˆเบชเบงเบ™."

เบงเบดเบ—เบตเบเบฒเบ™เบ—เปเปˆเบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™ Unix
เปƒเบ™เบ›เบทเป‰เบกเบ‚เบญเบ‡ Brian KernighanUnix: เบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”เปเบฅเบฐเบšเบฑเบ™เบ—เบถเบโ€, เบ›เบฐเบซเบงเบฑเบ”เบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบฅเบณเบฅเบฝเบ‡เบเบฑเบ‡เบเปˆเบฒเบงเป€เบ–เบดเบ‡เป€เบญเบเบฐเบชเบฒเบ™เบ™เบตเป‰เบงเปˆเบฒ: โ€œ... เบกเบฑเบ™เปเบ‚เบงเบ™เบขเบนเปˆเป€เบ—เบดเบ‡เบเบฒเปƒเบ™เบซเป‰เบญเบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเบขเบนเปˆ Bell Labs เป€เบ›เบฑเบ™เป€เบงเบฅเบฒ 30 เบ›เบต.โ€ เบ—เบตเปˆเบ™เบตเป‰ เบเบฒเบ™เบชเปเบฒเบžเบฒเบ”เบเบฑเบš McIlroyเปเบฅเบฐเป€เบฅเบทเปˆเบญเบ‡เบญเบทเปˆเบ™เบˆเบฒเบ เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡ McIlroy, เบ‚เบฝเบ™เปƒเบ™เบ›เบต 2014:

เป€เบกเบทเปˆเบญ Unix เบ›เบฐเบเบปเบ”เบ•เบปเบง, เบ„เบงเบฒเบกเบเบฐเบ•เบทเบฅเบทเบฅเบปเป‰เบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเบชเปเบฒเบฅเบฑเบš coroutines เป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เป‰เบญเบเบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบœเบนเป‰เบ‚เบฝเบ™ OS, Ken Thompson, เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™เบšเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเป„เบ›เบซเบฒเบญเบธเบ›เบฐเบเบญเบ™, เปเบ•เปˆเบเบฑเบ‡เป„เบ›เบซเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบทเปˆเบ™. Ken เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เปƒเบ™เบ–เบฒเบ™เบฐเบ—เบตเปˆเป€เบ›เบฑเบ™เบ„เบปเบ™เบซเบ™เป‰เบญเบ, เบฅเบฒเบงเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบ—เบธเบเป†เบฅเบฐเบšเบปเบšเบกเบตเบšเบปเบ”เบšเบฒเบ”เบชเปเบฒเบ„เบฑเบ™. เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ”เบเบเบปเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบญเบฑเบ™เปƒเบซเบเปˆเบซเบผเบงเบ‡เบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™เป„เบŸเบฅเปŒเบฅเบฐเบ”เบฑเบšเบเบฒเบ‡เบšเป? เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเป„เบ”เป‰เบชเบฐเป€เบซเบ™เบตเบ‚เปเป‰เบชเบฐเป€เบซเบ™เบตเบชเบฐเป€เบžเบฒเบฐเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบ—เบตเปˆเบซเบ™เป‰เบฒเบˆเบฑเบšเปƒเบˆ "เบ—เปเปˆ" เปเบฅเบฐเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบเปˆเบฝเบงเบเบฑเบš syntax เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™, Ken เบชเบธเบ”เบ—เป‰เบฒเบเป„เบ”เป‰เบฎเป‰เบญเบ‡เบญเบญเบเบกเบฒเบงเปˆเบฒ: "เบ‚เป‰เบญเบเบˆเบฐเป€เบฎเบฑเบ”เบกเบฑเบ™!".

เปเบฅเบฐเป„เบ”เป‰เป€เบฎเบฑเบ”. เบ•เบญเบ™เปเบฅเบ‡เป‚เบŠเบเบŠเบฐเบ•เบฒเบกเบทเป‰เบซเบ™เบถเปˆเบ‡, Ken เป„เบ”เป‰เบ›เปˆเบฝเบ™เปเบเปˆเบ™เปเบฅเบฐเปเบเบฐ, เปเบเป‰เป„เบ‚เบšเบฑเบ™เบ”เบฒเป‚เบ„เบ‡เบเบฒเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เป€เบžเบทเปˆเบญเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบเบญเบกเบฎเบฑเบšเบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™ (เป€เบŠเบดเปˆเบ‡เบญเบฒเบ”เบˆเบฐเบกเบฒเบˆเบฒเบเบ—เปเปˆ), เปเบฅเบฐเบ›เปˆเบฝเบ™เบŠเบทเปˆเป„เบŸเบฅเปŒ. เปƒเบ™เบกเบทเป‰เบ•เปเปˆเบกเบฒ, เบ—เปเปˆเป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบญเบฒเบ—เบดเบ”, เป€เบฅเบ‚เบฒเบ™เบธเบเบฒเบ™เป„เบ”เป‰เปƒเบŠเป‰เบžเบงเบเป€เบ‚เบปเบฒเป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เป€เบญเบเบฐเบชเบฒเบ™เบˆเบฒเบเบ•เบปเบงเบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ„เปเบฒเป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เบžเบดเบก. เบ•เปเปˆเบกเบฒ, Ken เป„เบ”เป‰เบ›เปˆเบฝเบ™เปเบ—เบ™ API เปเบฅเบฐ syntax เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบซเปเปˆเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เปเปˆเบเบฑเบšเบชเบปเบ™เบ—เบดเบชเบฑเบ™เบเบฒเบ—เบตเปˆเบชเบฐเบญเบฒเบ”เบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบ•เบฑเป‰เบ‡เปเบ•เปˆเบ™เบฑเป‰เบ™เบกเบฒ.

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡ Unix kernel เบชเบฐเบšเบฑเบšเบ—เบตเบชเบฒเบกเป„เบ”เป‰เบชเบนเบ™เป€เบชเบเป„เบ›. เปเบฅเบฐเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡ kernel เบ‚เบฝเบ™เปƒเบ™ C เบชเบฐเบšเบฑเบšเบ—เบตเบชเบตเปˆ, เป€เบŠเบดเปˆเบ‡เป„เบ”เป‰เบ–เบทเบเบ›เปˆเบญเบเบญเบญเบเบกเบฒเปƒเบ™เป€เบ”เบทเบญเบ™เบžเบฐเบˆเบดเบ 1973, เปเบ•เปˆเบกเบฑเบ™เบญเบญเบเบกเบฒเบชเบญเบ‡เบชเบฒเบกเป€เบ”เบทเบญเบ™เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบตเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™เปเบฅเบฐเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ—เปเปˆ. เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เป€เบชเบเปƒเบˆเบ—เบตเปˆเบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” Unix legendary เบ™เบตเป‰เบชเบนเบ™เป€เบชเบ, เบšเบฒเบ‡เบ—เบตเบ•เบฐเบซเบผเบญเบ”เป„เบ›.

เบžเบงเบเป€เบฎเบปเบฒเบกเบตเป€เบญเบเบฐเบชเบฒเบ™เป€เบญเบเบฐเบชเบฒเบ™เบชเปเบฒเบฅเบฑเบš pipe(2) เบˆเบฒเบเบ—เบฑเบ‡เบชเบญเบ‡เบชเบฐเบšเบฑเบš, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ”เบเบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเป€เบญเบเบฐเบชเบฒเบ™ เบชเบฐเบšเบฑเบšเบ—เบตเบชเบฒเบก (เบชเบณเบฅเบฑเบšเบšเบฒเบ‡เบ„เบณ, เบ‚เบตเบ”เบเป‰เบญเบ‡ "เบ”เป‰เบงเบเบกเบท", เป€เบ›เบฑเบ™เบชเบฐเบ•เบฃเบดเบ‡เบ‚เบญเบ‡ ^H เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ•เบฒเบกเบ”เป‰เบงเบเป€เบ„เบทเปˆเบญเบ‡เปเบฒเบเบ‚เบตเบ”เบเป‰เบญเบ‡!). เบ™เบตเป‰ proto-pipe(2) เบ–เบทเบเบ‚เบฝเบ™เป„เบงเป‰เปƒเบ™เบ•เบปเบงเบ›เบฐเบเบญเบšเปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเป„เบŸเบฅเปŒ, เปเบ•เปˆเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบซเบผเบฑเบเบ—เบตเปˆเบ„เบฒเบ”เป„เบงเป‰เปเบฅเป‰เบง:

เป‚เบ—เบฅเบฐเบšเบปเบš เบ—เปเปˆ เบชเป‰เบฒเบ‡เบเบปเบ™เป„เบ I/O เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ pipeline. เบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเป„เบŸเบฅเปŒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเปˆเบฒเบ™เปเบฅเบฐเบ‚เบฝเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™. เป€เบกเบทเปˆเบญเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ–เบทเบเบ‚เบฝเบ™เปƒเบชเปˆเบ—เปเปˆ, เบกเบฑเบ™ buffers เป€เบ–เบดเบ‡ 504 bytes เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบฝเบ™เบ–เบทเบเป‚เบˆเบฐ. เป€เบกเบทเปˆเบญเบญเปˆเบฒเบ™เบˆเบฒเบเบ—เปเปˆ, เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบ buffed เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”.

เปƒเบ™เบ›เบตเบ•เปเปˆเบกเบฒ, kernel เป„เบ”เป‰เบ–เบทเบเบ‚เบฝเบ™เบ„เบทเบ™เปƒเบซเบกเปˆเปƒเบ™ C, เปเบฅเบฐ pipe(2) เบชเบฐเบšเบฑเบšเบ—เบตเบชเบตเปˆ เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบฎเบนเบšโ€‹เปเบšเบšโ€‹เบ—เบตเปˆโ€‹เบ—เบฑเบ™โ€‹เบชเบฐโ€‹เป„เบซเบกโ€‹เบ‚เบญเบ‡โ€‹เบ•เบปเบ™โ€‹เบเบฑเบšโ€‹เบ•เบปเป‰เบ™โ€‹เปเบšเบš "pipe(fildes)"

เป‚เบ—เบฅเบฐเบšเบปเบš เบ—เปเปˆ เบชเป‰เบฒเบ‡เบเบปเบ™เป„เบ I/O เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ—เปเปˆเบชเบปเปˆเบ‡. เบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเป„เบŸเบฅเปŒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบเบฒเบ™เบญเปˆเบฒเบ™เปเบฅเบฐเบ‚เบฝเบ™. เป€เบกเบทเปˆเบญเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ–เบทเบเบ‚เบฝเบ™เปƒเบชเปˆเบ—เปเปˆ, เบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเบเบฑเบšเบ„เบทเบ™เปƒเบ™ r1 (resp. fildes[1]) เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, buffed เป€เบ–เบดเบ‡ 4096 bytes เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบฝเบ™เบ–เบทเบเป‚เบˆเบฐ. เป€เบกเบทเปˆเบญเบญเปˆเบฒเบ™เบˆเบฒเบเบ—เปเปˆ, เบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒ r0 (resp. fildes[0]) เป€เบญเบปเบฒเบ‚เปเป‰เบกเบนเบ™.

เบกเบฑเบ™เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเป€เบกเบทเปˆเบญเบ—เปเปˆเป„เบ”เป‰เบ–เบทเบเบเปเบฒเบ™เบปเบ”, เบชเบญเบ‡ (เบซเบผเบทเบซเบผเบฒเบเบเบงเปˆเบฒ) เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบชเปเบฒเบžเบฑเบ™ (เบชเป‰เบฒเบ‡เป‚เบ”เบเบเบฒเบ™เบฎเบฝเบเบฎเป‰เบญเบ‡เบ•เปเปˆเป„เบ›. fork) เบˆเบฐเบœเปˆเบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบ—เปเปˆเป‚เบ”เบเปƒเบŠเป‰เบเบฒเบ™เป‚เบ— เบญเปˆเบฒเบ™ ะธ เบ‚เบฝเบ™.

Shell เบกเบต syntax เบชเปเบฒเบฅเบฑเบšเบเปเบฒเบ™เบปเบ” array linear เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบœเปˆเบฒเบ™เบ—เปเปˆ.

เป‚เบ—เบซเบฒเป€เบžเบทเปˆเบญเบญเปˆเบฒเบ™เบˆเบฒเบเบ—เปเปˆเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ (เบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบต buffered) เบ—เบตเปˆเบกเบตเบˆเบธเบ”เบˆเบปเบšเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡ (เบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเป„เบŸเบฅเปŒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบ›เบดเบ”) เบเบฑเบšเบ„เบทเบ™ "เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เป„เบŸเบฅเปŒ". เบ‚เบฝเบ™เบเบฒเบ™เป‚เบ—เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เปเบกเปˆเบ™เบ–เบทเบเบฅเบฐเป€เบฅเบตเบ.

เป„เบงเบ—เบตเปˆเบชเบธเบ” เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เปเปˆเบ—เบตเปˆเบ–เบทเบเบฎเบฑเบเบชเบฒเป„เบงเป‰ เปเบฒเบ เป€เบ–เบดเบ‡ เบˆเบปเบ™เป€เบ–เบดเบ‡เบชเบฐเบšเบฑเบšเบ—เบต XNUMX เบ‚เบญเบ‡ Unix (เป€เบ”เบทเบญเบ™เบกเบดเบ–เบธเบ™เบฒ 1974), เปเบ•เปˆเบกเบฑเบ™เป€เบเบทเบญเบšเบ„เบทเบเบฑเบ™เบเบฑเบšเบ—เบตเปˆเบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบเบฒเบ™เบ›เปˆเบญเบเบ•เปเปˆเป„เบ›. เบžเบฝเบ‡เปเบ•เปˆเบ„เปเบฒเป€เบซเบฑเบ™เป€เบžเบตเปˆเบก, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบชเบฐเบšเบฑเบšเบ—เบตเบซเป‰เบฒเบชเบฒเบกเบฒเบ”เบ‚เป‰เบฒเบกเป„เบ”เป‰.

Unix เบชเบฐเบšเบฑเบšเบ—เบตเบซเบปเบ (1975)

เป€เบฅเบตเปˆเบกเบญเปˆเบฒเบ™เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡ Unix เบชเบฐเบšเบฑเบšเบ—เบตเบซเบปเบ (เป€เบ”เบทเบญเบ™เบžเบถเบ”เบชเบฐเบžเบฒ 1975). เบ‚เบญเบšเปƒเบˆเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆ เบŠเป‰เบฒเบ‡ เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบซเบผเบฒเบโ€‹เบ‡เปˆเบฒเบโ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบŠเบญเบโ€‹เบซเบฒโ€‹เบโ€‹เปˆโ€‹เบงเบฒโ€‹เปเบซเบผเปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ‚เบญเบ‡โ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบเปˆเบญเบ™โ€‹เบซเบ™เป‰เบฒโ€‹เบ™เบตเป‰โ€‹:

เบชเปเบฒเบฅเบฑเบšเป€เบงเบฅเบฒเบซเบผเบฒเบเบ›เบตเบซเบ™เบฑเบ‡เบชเบท เบŠเป‰เบฒเบ‡ เป€เบ›เบฑเบ™เป€เบญเบเบฐเบชเบฒเบ™เบ”เบฝเบงเปƒเบ™ kernel Unix เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™ Bell Labs. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบšเบญเบฐเบ™เบธเบเบฒเบ”เบชเบฐเบšเบฑเบšเบ—เบต XNUMX เป„เบ”เป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ„เบนเบชเบญเบ™เปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบกเบฑเบ™, เปเบ•เปˆเปƒเบšเบญเบฐเบ™เบธเบเบฒเบ”เบชเบฐเบšเบฑเบšเบ—เบต XNUMX เบšเปเปˆเป„เบ”เป‰เบฅเบงเบกเป€เบญเบปเบฒเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ™เบตเป‰, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ›เบทเป‰เบกเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป„เบ”เป‰เบ–เบทเบเปเบˆเบเบขเบฒเบเปƒเบ™เบชเปเบฒเป€เบ™เบปเบฒเบ—เบตเปˆเบ‚เบฝเบ™เบœเบดเบ”เบเบปเบ”เบซเบกเบฒเบ.

เบกเบทเป‰โ€‹เบ™เบตเป‰โ€‹เป€เบˆเบปเป‰เบฒโ€‹เบชเบฒเบกเบฒเบ”โ€‹เบŠเบทเป‰โ€‹เบ›เบถเป‰เบกโ€‹เบ—เบตเปˆโ€‹เบžเบดเบกโ€‹เบ„เบทเบ™โ€‹เปƒเปเปˆโ€‹เป„เบ”เป‰, เปœเป‰เบฒโ€‹เบ›เบปเบโ€‹เบ—เบตเปˆโ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบ™เบฑเบโ€‹เบชเบถเบเบชเบฒโ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบชเบณเป€เบ™เบปเบฒ. เปเบฅเบฐเบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบš Warren Toomey (เบœเบนเป‰เบ—เบตเปˆเป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ„เบ‡เบเบฒเบ™ TUHS), เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เบฒเบงเป‚เบซเบฅเบ”เป„เบ”เป‰ เบชเบฐเบšเบฑเบšเบ—เบต VI เปเบซเบผเปˆเบ‡ PDF. เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เป€เบˆเบปเป‰เบฒเบฎเบนเป‰เบงเปˆเบฒเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ”เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ:

เบซเบผเบฒเบเบเบงเปˆเบฒ 15 เบ›เบตเบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบžเบดเบกเบชเปเบฒเป€เบ™เบปเบฒเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เบขเบนเปˆเปƒเบ™ เบŠเป‰เบฒเบ‡เป€เบžเบฒเบฐเบงเปˆเบฒเบ‚เป‰เบญเบเบšเปเปˆเบกเบฑเบเบ„เบธเบ™เบ™เบฐเบžเบฒเบšเบ‚เบญเบ‡เบชเบณเป€เบ™เบปเบฒเบ‚เบญเบ‡เบ‚เป‰เบญเบเบˆเบฒเบเบชเบณเป€เบ™เบปเบฒเบญเบทเปˆเบ™เบ—เบตเปˆเบšเปเปˆเบฎเบนเป‰เบˆเบฑเบ. TUHS เบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เบกเบตเป€เบ—เบทเปˆเบญ, เปเบฅเบฐเบ‚เป‰เบญเบเบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เปเบซเบผเปˆเบ‡เป€เบเบปเปˆเบฒ. เปเบ•เปˆโ€‹เปƒเบ™โ€‹เบ›เบต 1988 เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เบžเบปเบšโ€‹เป€เบซเบฑเบ™ tape เป€เบเบปเปˆเบฒโ€‹เบ—เบตเปˆโ€‹เบกเบต 9 เป€เบžเบ‡โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบชเปเบฒโ€‹เบฎเบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบˆเบฒเบโ€‹เบ„เบญเบกโ€‹เบžเบดเบงโ€‹เป€เบ•เบต PDP11โ€‹. เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบเบฒเบเบ—เบตเปˆเบˆเบฐเบฎเบนเป‰เบงเปˆเบฒเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เปเบ•เปˆเบงเปˆเบฒเบกเบตเบ•เบปเป‰เบ™เป„เบกเป‰ /usr/src/ intact เบ—เบตเปˆเป„เบŸเบฅเปŒเบชเปˆเบงเบ™เปƒเบซเบเปˆเบ–เบทเบเบซเบกเบฒเบเปƒเบ™เบ›เบต 1979, เป€เบŠเบดเปˆเบ‡เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเป€เบšเบดเปˆเบ‡เบ„เบทเป€เบเบปเปˆเบฒ. เบกเบฑเบ™เปเบกเปˆเบ™เบชเบฐเบšเบฑเบšเบ—เบตเป€เบˆเบฑเบ”, เบซเบผเบทเป€เบ›เบฑเบ™เบญเบฐเบ™เบธเบžเบฑเบ™ PWB, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒ.

เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เป€เบญเบปเบฒโ€‹เบเบฒเบ™โ€‹เบŠเบญเบโ€‹เบซเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เบžเบทเป‰เบ™โ€‹เบ–เบฒเบ™โ€‹เปเบฅเบฐโ€‹เบ„เบนเปˆโ€‹เบกเบทโ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เปเบซเบผเปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบ—เบตโ€‹เบซเบปเบโ€‹. เบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เบเบฑเบ‡เบ„เบปเบ‡เบ„เบทเป€เบเบปเปˆเบฒ, เบžเบฒเบเบชเปˆเบงเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เป€เบฅเบฑเบเบ™เป‰เบญเบ, เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ token เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก += เป€เบ›เบฑเบ™เบฅเป‰เบฒเบชเบฐเป„เบซเบก =+. เบšเบฒเบ‡โ€‹เบชเบดเปˆเบ‡โ€‹เบšเบฒเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เบ–เบทเบโ€‹เบฅเบปเบšโ€‹เบญเบญเบโ€‹เบขเปˆเบฒเบ‡โ€‹เบ‡เปˆเบฒเบโ€‹เบ”เบฒเบ, เปเบฅเบฐโ€‹เบšเบฒเบ‡โ€‹เบชเบดเปˆเบ‡โ€‹เบšเบฒเบ‡โ€‹เบขเปˆเบฒเบ‡โ€‹เบ•เป‰เบญเบ‡โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ‚เบฝเบ™โ€‹เบ„เบทเบ™โ€‹เปƒเบซเบกเปˆโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”, เปเบ•เปˆโ€‹เบšเปเปˆโ€‹เบซเบผเบฒเบโ€‹เป€เบเบตเบ™โ€‹เป„เบ›.

เปเบฅเบฐเบกเบทเป‰เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบญเบญเบ™เป„เบฅเบ™เปŒเบขเบนเปˆ TUHS เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบชเบฐเบšเบฑเบšเบ—เบต VI เบ‚เบญเบ‡ เบฎเบงเบšเบฎเบงเบก, เป€เบŠเบดเปˆเบ‡ Dennis Ritchie เบกเบตเบกเบท.

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบขเบนเปˆ glance เบ—เปเบฒเบญเบดเบ”, เบฅเบฑเบเบชเบฐเบ™เบฐเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ” C เบเปˆเบญเบ™เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ‚เบญเบ‡ Kernighan เปเบฅเบฐ Ritchie เปเบกเปˆเบ™เบ‚เบญเบ‡เบ•เบปเบ™. เบซเบเปเป‰. เบกเบฑเบ™เบšเปเปˆเป€เบฅเบทเป‰เบญเบเป†เบ—เบตเปˆเบ‚เป‰เบญเบเบชเบฒเบกเบฒเบ”เปƒเบชเปˆเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ”เบฑเบ”เปเบเป‰เบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡เป€เบžเบทเปˆเบญเปƒเบซเป‰เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบžเบทเป‰เบ™เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เปเบ„เบšเบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ‚เบญเบ‡เบ‚เป‰เบญเบ.

เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ /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, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบ "เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ" เป€เบžเบทเปˆเบญเบ›เบฐเบกเบงเบ™เบœเบปเบ™ เบ•เบฑเบ™เบ—เบฒเบ‡เบญเป‰เบญเบก เป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบฅเบฐเบšเบปเบšเป„เบŸเบฅเปŒเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบ Ken เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบšเปเปˆเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™, เบ‚เป‰เบญเบเบเบดเบ™เบ”เบตเบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเบ„เปเบฒเป€เบงเบปเป‰เบฒเบ‚เบญเบ‡เบฅเบฒเบงเบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™.

เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เป‚เบ—เบฅเบฐเบšเบปเบšเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡ 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() - เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบชเบญเบ‡ เป„เบŸเบฅ. เบ–เป‰เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ”เบต, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เบฑเป‰เบ‡เบ—เบธเบ‡เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เป„เบŸเบฅเปŒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบ›เบฑเบ™เบชเบญเบ‡เบชเบปเป‰เบ™เบ‚เบญเบ‡เบ—เปเปˆ, เบŠเบตเป‰เบžเบงเบเบกเบฑเบ™เป„เบ›เบซเบฒ inode เบ”เบฝเบงเบเบฑเบ™ (เป€เบŠเบดเปˆเบ‡เบ„เปเบฒเบญเป‰เบฒเบ‡เบญเบตเบ‡เบเบฒเบเป€เบ›เบฑเบ™ 2), เปเบฅเบฐเบซเบกเบฒเบ inode เบ—เบตเปˆเบ–เบทเบเบ”เบฑเบ”เปเบเป‰เปเบฅเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰. เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป เบ‚เป‰เบญเบโ€‹เป€เบญเบปเบฒโ€‹เปƒเบชเปˆ() เปƒเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบˆเบฐเบซเบผเบธเบ”เบฅเบปเบ‡เบเบฒเบ™เบ™เบฑเบšเบญเป‰เบฒเบ‡เบญเบตเบ‡เปƒเบ™ inode เปƒเบซเบกเปˆ.

pipe() เบœเปˆเบฒเบ™โ€‹เบเบฒเบ™ R0 ะธ R1 เบเบฑเบšเบ„เบทเบ™เบ•เบปเบงเป€เบฅเบเบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเป„เบŸเบฅเปŒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเปˆเบฒเบ™เปเบฅเบฐเบ‚เบฝเบ™. falloc() เบชเบปเปˆเบ‡เบ„เบทเบ™เบ•เบปเบงเบŠเบตเป‰เป„เบ›เบซเบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒ, เปเบ•เปˆเบเบฑเบ‡ "เบเบฑเบšเบ„เบทเบ™" เบœเปˆเบฒเบ™ u.u_ar0[R0] เปเบฅเบฐเบ•เบปเบงเบญเบฐเบ—เบดเบšเบฒเบเป„เบŸเบฅเปŒ. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบฅเบฐเบซเบฑเบ”เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ r file descriptor เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเปˆเบฒเบ™เปเบฅเบฐเบกเบญเบšเบซเบกเบฒเบ descriptor เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ”เบเบเบปเบ‡เบˆเบฒเบ u.u_ar0[R0] เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เป‚เบ—โ€‹เบ„เบฑเป‰เบ‡โ€‹เบ—เบตโ€‹เบชเบญเบ‡โ€‹ falloc().

Flag FPIPE, เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ—เปเปˆ, เบ„เบงเบšเบ„เบธเบกเบžเบถเบ”เบ•เบดเบเปเบฒเบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆ rdwr() เปƒเบ™ sys2.c, เป€เบŠเบดเปˆเบ‡เป€เบญเบตเป‰เบ™เบชเบฐเป€เบžเบฒเบฐ I / O routines:

/*
 * 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;
}

เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™ bytes เป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เปเปˆ u.u_count. เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฅเบฑเบญเบ inode (เป€เบšเบดเปˆเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰ plock/prele).

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบ™เบฑเบšเบญเป‰เบฒเบ‡เบญเบตเบ‡ inode. เบ•เบฒเบšเปƒเบ”เบ—เบตเปˆเบ—เบฑเบ‡เบชเบญเบ‡เบชเบปเป‰เบ™เบ‚เบญเบ‡เบ—เปเปˆเบเบฑเบ‡เป€เบ›เบตเบ”เบขเบนเปˆ, เป€เบ„เบปเบฒเป€เบ•เบตเบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™ 2. เบžเบงเบเป€เบฎเบปเบฒเบเบถเบ”เบ•เบดเบ”เบเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ”เบฝเบง (เบˆเบฒเบ. rp->f_inode), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ–เป‰เบฒ counter เบซเบ™เป‰เบญเบเบเบงเปˆเบฒ 2, เบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเปˆเบฒเบ™เป„เบ”เป‰เบ›เบดเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบ—เปเปˆเบ‚เบญเบ‡เบกเบฑเบ™. เปƒเบ™เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†เบญเบทเปˆเบ™เป†, เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบžเบฐเบเบฒเบเบฒเบกเบ‚เบฝเบ™เป€เบ–เบดเบ‡เบ—เปเปˆเบ›เบดเบ”, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”. เบฅเบฐเบซเบฑเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ” EPIPE เปเบฅเบฐเบชเบฑเบ™เบเบฒเบ™ SIGPIPE เบ›เบฐเบเบปเบ”เบขเบนเปˆเปƒเบ™เบชเบฐเบšเบฑเบšเบ—เบต VI เบ‚เบญเบ‡ Unix.

เปเบ•เปˆเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ conveyor เป€เบ›เบตเบ”, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ•เบฑเบก. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบ›เปˆเบญเบ lock เปเบฅเบฐเป„เบ›เบ™เบญเบ™เปƒเบ™เบ„เบงเบฒเบกเบซเบงเบฑเบ‡เบงเปˆเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบทเปˆเบ™เบˆเบฐเบญเปˆเบฒเบ™เบˆเบฒเบเบ—เปเปˆเปเบฅเบฐเบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเบซเบงเปˆเบฒเบ‡เบžเบฝเบ‡เบžเปเปƒเบ™เบกเบฑเบ™. เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเบ•เบทเปˆเบ™เบ‚เบถเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบšเบ„เบทเบ™เบชเบนเปˆเบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบงเบฒเบ‡เบชเบฒเบเบฅเบฑเบญเบเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เปเบฅเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบงเบปเบ‡เบˆเบญเบ™เบเบฒเบ™เบ‚เบฝเบ™เปƒเบซเบกเปˆ.

เบ–เป‰เบฒเบกเบตเบžเบทเป‰เบ™เบ—เบตเปˆเบซเบงเปˆเบฒเบ‡เบžเบฝเบ‡เบžเปเปƒเบ™เบ—เปเปˆ, เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฝเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰ เบ‚เบฝเบ™(). เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต i_size1 inode'a (เบกเบตเบ—เปเปˆเป€เบ›เบปเปˆเบฒเบชเบฒเบกเบฒเบ”เป€เบ—เบปเปˆเบฒเบเบฑเบš 0) เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบฑเบ™เบกเบตเบขเบนเปˆเปเบฅเป‰เบง. เบ–เป‰เบฒเบกเบตเบžเบทเป‰เบ™เบ—เบตเปˆเบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบ‚เบฝเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆเบ—เปเปˆเบˆเบฒเบ i_size1 เบเบฒเบ™ PIPESIZ. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ›เปˆเบญเบเบ•เบปเบงเบฅเบฑเบญเบเปเบฅเบฐเบžเบฐเบเบฒเบเบฒเบกเบ›เบธเบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปƒเบ”เป†เบ—เบตเปˆเบฅเปเบ–เป‰เบฒเบเบฒเบ™เบญเปˆเบฒเบ™เบˆเบฒเบเบ—เปเปˆ. เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบšเบ„เบทเบ™เป„เบ›เบซเบฒเบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบ‚เบฝเบ™เบซเบผเบฒเบ bytes เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™. เบ–เป‰เบฒเบšเปเปˆ, เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบฎเบญเบšเบšเบฑเบ™เบ—เบถเบเปƒเบซเบกเปˆ.

เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต i_mode inode เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ” r, w ะธ x. เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบ—เปเปˆ, เบžเบงเบเป€เบฎเบปเบฒเบชเบฑเบ™เบเบฒเบ™เบงเปˆเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบฅเปเบ–เป‰เบฒเบเบฒเบ™เบ‚เบฝเบ™เบซเบผเบทเบญเปˆเบฒเบ™เป‚เบ”เบเปƒเบŠเป‰ bits IREAD ะธ IWRITE เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš. เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบ—เบธเบ‡เปเบฅเบฐเป‚เบ—เบซเบฒ sleep(), เปเบฅเบฐเบ„เบฒเบ”เบงเปˆเบฒเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”เบšเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบญเบทเปˆเบ™เป†เบˆเบฐเป‚เบ—เบซเบฒ wakeup().

magic เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™ 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 เปเบฅเบฐเบžเบฐเบเบฒเบเบฒเบกเบ›เบธเบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เปƒเบ”เป†เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™เปƒเบชเปˆเบ—เปเปˆ. เบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เบงเปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆ conveyor เป€เบ•เบฑเบก, writep() เบ™เบญเบ™เบซเบฅเบฑเบšเบขเบนเปˆ ip+1. เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เบตเปˆเบ—เปเปˆเบ™เบฑเป‰เบ™เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ›เบธเบเบกเบฑเบ™เบ‚เบถเป‰เบ™เบกเบฒเป€เบžเบทเปˆเบญเบชเบทเบšเบ•เปเปˆเบฎเบญเบšเบงเบฝเบ™เบเบฒเบ™เบ‚เบฝเบ™เบ‚เบญเบ‡เบกเบฑเบ™.

เบ–เป‰เบฒเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ readp() เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบ—เบธเบ‡ IREAD เปเบฅเบฐเบ™เบญเบ™เบซเบฅเบฑเบš ip+2. เบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เบงเปˆเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบ›เบธเบเบฅเบฒเบง writep()เป€เบกเบทเปˆเบญเบกเบฑเบ™เบ‚เบฝเบ™เบ‚เปเป‰เบกเบนเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เปƒเบชเปˆเบ—เปเปˆเบ™เบฑเป‰เบ™.

เบ„เปเบฒเป€เบซเบฑเบ™เบเปˆเบฝเบงเบเบฑเบš เบญเปˆเบฒเบ™() เปเบฅเบฐ writei() เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบœเปˆเบฒเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบœเปˆเบฒเบ™ "uยป เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เปƒเบซเป‰โ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ„เบทโ€‹เบซเบ™เป‰เบฒโ€‹เบ—เบตเปˆ I/O เบ›เบปเบโ€‹เบเบฐโ€‹เบ•เบดโ€‹เบ—เบตเปˆโ€‹เปƒเบŠเป‰โ€‹เป„เบŸเบฅโ€‹เปŒโ€‹, เบ•เปเบฒโ€‹เปเบซเบ™เปˆเบ‡โ€‹, buffer เปƒเบ™โ€‹เบซเบ™เปˆเบงเบโ€‹เบ„เบงเบฒเบกโ€‹เบˆเปเบฒโ€‹, เปเบฅเบฐโ€‹เบ™เบฑเบšโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡ bytes เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบญเปˆเบฒเบ™โ€‹เบซเบผเบทโ€‹เบ‚เบฝเบ™โ€‹.

/*
 * 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() lock inodes เบˆเบปเบ™เบเปˆเบงเบฒเบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเปเบฒเป€เบฅเบฑเบ”เบซเบผเบทเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš (เป€เบŠเบฑเปˆเบ™: เป‚เบ— 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() เป‚เบ—เบซเบฒเปƒเบ™ loop เบ‚เบญเบ‡เบ•เบปเบ™, เบ™เบตเป‰ plock(ip), เป€เบŠเบดเปˆเบ‡เบชเบปเปˆเบ‡เบœเบปเบ™เปƒเบซเป‰เบกเบตเบเบฒเบ™เบขเบธเบ”เป€เบŠเบปเบฒเบ–เป‰เบฒ readp() เบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰เป€เบญเบปเบฒเบšเบฅเบฑเบญเบเบ‚เบญเบ‡เบกเบฑเบ™เบญเบญเบเป€เบ—เบทเปˆเบญ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบฅเบฐเบซเบฑเบ”เบˆเบฐเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡ wakeup(), เบกเบฑเบ™เบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆ marks เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบญเบ™เปเบกเปˆเบ™เบเบฝเบกเบžเป‰เบญเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ” sched() เป€เบ›เบตเบ”เบ•เบปเบงเปเบ—เป‰เป†. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ readp() เบชเบฒเป€เบซเบ” wakeup(), unlocks, เบŠเบธเบ” IREAD เปเบฅเบฐเบเบฒเบ™เป‚เบ— sleep(ip+2)- เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบเปˆเบญเบ™ writep() เบฃเบตเบชเบฐเบ•เบฒเบ”เบฎเบญเบšเบงเบฝเบ™.

เบ™เบตเป‰เป€เบฎเบฑเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบเปˆเบฝเบงเบเบฑเบšเบ—เปเปˆเปƒเบ™เบชเบฐเบšเบฑเบšเบ—เบตเบซเบปเบ. เบฅเบฐเบซเบฑเบ”เบ‡เปˆเบฒเบเบ”เบฒเบ, เบœเบปเบ™เบชเบฐเบ—เป‰เบญเบ™เป„เบ.

เบชเบฐเบšเบฑเบšเบ—เบตเป€เบˆเบฑเบ” Unix (เป€เบ”เบทเบญเบ™เบกเบฑเบ‡เบเบญเบ™ 1979) เป€เบ›เบฑเบ™เบเบฒเบ™เบ›เปˆเบญเบเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปƒเบซเบกเปˆ (เบชเบตเปˆเบ›เบตเบ•เปเปˆเบกเบฒ) เบ—เบตเปˆเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปƒเบซเบกเปˆเบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบเปเบฅเบฐเบฅเบฑเบเบชเบฐเบ™เบฐ kernel. เบกเบฑเบ™เบเบฑเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปƒเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เบซเบฅเปเปˆ, เบชเบฐเบซเบฐเบžเบฑเบ™เปเบฅเบฐเบ•เบปเบงเบŠเบตเป‰เบ—เบตเปˆเบžเบดเบกเบเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡. เปเบ™เบงเปƒเบ”เบเปเปˆเบ•เบฒเบก เบฅเบฐเบซเบฑเบ”เบ—เปเปˆ เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบšเปเปˆเป„เบ”เป‰เบ›เปˆเบฝเบ™เปเบ›เบ‡. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ‚เป‰เบฒเบกเบชเบฐเบšเบฑเบšเบ™เบตเป‰เป„เบ”เป‰.

Xv6, เป€เบ›เบฑเบ™เปเบเปˆเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบท Unix เบ‡เปˆเบฒเบเบ”เบฒเบ

เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ™เบดเบงเป€เบ„เบฅเบ Xv6 เป„เบ”เป‰เบฎเบฑเบšเบญเบดเบ”เบ—เบดเบžเบปเบ™เบˆเบฒเบเบชเบฐเบšเบฑเบšเบ—เบต 86 เบ‚เบญเบ‡ Unix, เปเบ•เปˆเบ‚เบฝเบ™เปƒเบ™ C เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบฑเบšเป‚เบ›เป€เบŠเบ”เป€เบŠเบต x11. เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™เปเบฅเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเป„เบ”เป‰. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบšเปเบซเบผเปˆเบ‡ Unix เบเบฑเบš TUHS, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบฅเบงเบšเบฅเบงเบกเบกเบฑเบ™, เบ”เบฑเบ”เปเบ›เบ‡เบกเบฑเบ™, เปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบฑเบšเบชเบดเปˆเบ‡เบญเบทเปˆเบ™เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™ PDP 70/XNUMX. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบซเบผเบฑเบเบ™เบตเป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡เปƒเบ™เบงเบดเบ—เบฐเบเบฒเป„เบฅเป€เบ›เบฑเบ™เบญเบธเบ›เบฐเบเบญเบ™เบเบฒเบ™เบชเบญเบ™เบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™. เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™ เบขเบนเปˆเปƒเบ™ Github.

เบฅเบฐเบซเบฑเบ”เบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เปเบฅเบฐเบ„เบดเบ” pipe.c, เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป‚เบ”เบ buffer เปƒเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™ inode เปƒเบ™เปเบœเปˆเบ™. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเปƒเบซเป‰เบ„เปเบฒเบ™เบดเบเบฒเบกเบ‚เบญเบ‡ "เบ—เปเปˆเป‚เบ„เบ‡เบชเป‰เบฒเบ‡" เปเบฅเบฐเบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™ 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 เป€เบ›เบฑเบ™ wrapper เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™ sysfile.c. เบ‚เป‰เบญเบเบ‚เปเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบญเปˆเบฒเบ™เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบฅเบฒเบงเบ—เบฑเบ‡เบซเบกเบปเบ”. เบ„เบงเบฒเบกเบชเบฑเบšเบชเบปเบ™เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบฅเบฐเบ”เบฑเบšเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบชเบฐเบšเบฑเบšเบ—เบต XNUMX, เปเบ•เปˆเบกเบฑเบ™เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบซเบผเบฒเบเปเบฅเบฐเบกเบตเบ„เบงเบฒเบกเบชเบธเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™.

Linux 0.01

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบชเปเบฒเบฅเบฑเบš Linux 0.01. เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบˆเบฐเบชเบถเบเบชเบฒเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เปเปˆเบขเบนเปˆเปƒเบ™เบฅเบฒเบง fs/pipe.c. เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰, inode เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบ—เปเปˆ, เปเบ•เปˆเบ—เปเปˆเบ™เบฑเป‰เบ™เป€เบญเบ‡เปเบกเปˆเบ™เบ‚เบฝเบ™เปƒเบ™ C เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป„เบ”เป‰ hack เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบœเปˆเบฒเบ™เบฅเบฐเบซเบฑเบ”เบชเบฐเบšเบฑเบšเบ—เบต 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;
}

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเปเปˆเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบ„เปเบฒเบ™เบดเบเบฒเบกเบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ„เบดเบ”เบญเบญเบเบงเบดเบ—เบตเบเบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡ inode เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ‚เบฝเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบ™. SIGPIPE. เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ byte-by-byte, เบซเบ™เป‰เบฒเบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบ›เบฝเบšเบ—เบฝเบšเบเบฑเบšเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเป€เบซเบ”เบœเบปเบ™ sleep_on/wake_up เบšเปเปˆเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบ„เบทเบกเบฐเบ™เบธเบ”เบ•เปˆเบฒเบ‡เบ”เบฒเบง.

Linux Kernels เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก, FreeBSD, NetBSD, OpenBSD

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป„เบ›เบœเปˆเบฒเบ™เปเบเปˆเบ™เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเบšเบฒเบ‡เบญเบฑเบ™เบขเปˆเบฒเบ‡เป„เบงเบงเบฒ. เบšเปเปˆเบกเบตเปƒเบœเปƒเบ™เบžเบงเบเบกเบฑเบ™เบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆเปเบœเปˆเบ™ (เบšเปเปˆเปเบ›เบเปƒเบˆ). Linux เบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡. เปเบฅเบฐเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบชเบฒเบกเป€เบกเบฑเบ” BSD เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบกเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ–เบทเบเบ‚เบฝเบ™เป‚เบ”เบ John Dyson, เปƒเบ™เป„เบฅเบเบฐเบ›เบตเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบเบตเบ™เป„เบ›เบˆเบฒเบเบเบฑเบ™เปเบฅเบฐเบเบฑเบ™.

เบญเปˆเบฒเบ™ fs/pipe.c (เปƒเบ™ Linux) เบซเบผเบท sys/kern/sys_pipe.c (เปƒเบ™ *BSD), เบกเบฑเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒเบเบฒเบ™เบญเบธเบ—เบดเบ”เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡. เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš เปเบฅเบฐเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เป€เบŠเบฑเปˆเบ™ vector เปเบฅเบฐ asynchronous I/O เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เปƒเบ™เบฅเบฐเบซเบฑเบ”เปƒเบ™เบกเบทเป‰เบ™เบตเป‰. เปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบเบฒเบ™เบˆเบฑเบ”เบชเบฑเบ™เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒ, locks, เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ kernel เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ. เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบฐเบซเบฒเบงเบดเบ—เบฐเบเบฒเป„เบฅเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบซเบผเบฑเบเบชเบนเบ”เปเบ™เบฐเบ™เปเบฒเบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™.

เปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบกเบฑเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบเบ—เบตเปˆเบˆเบฐเบ„เบปเป‰เบ™เบžเบปเบšเบฎเบนเบšเปเบšเบšเป€เบเบปเปˆเบฒเบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบญเบ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เบชเป‰เบฒเบ‡ SIGPIPE เปเบฅเบฐเบเบฑเบšเบ„เบทเบ™ EPIPE เป€เบกเบทเปˆเบญเบ‚เบฝเบ™เปƒเบชเปˆเบ—เปเปˆเบ›เบดเบ”) เปƒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบเปˆเบ™เบ—เบตเปˆเบ—เบฑเบ™เบชเบฐเป„เบซเบก. เบ‚เป‰เบญเบเบญเบฒเบ”เบˆเบฐเบšเปเปˆเป€เบ„เบตเบเป€เบซเบฑเบ™เบ„เบญเบกเบžเบดเบงเป€เบ•เบต PDP-11 เบกเบตเบŠเบตเบงเบดเบ”เบขเบนเปˆ, เปเบ•เปˆเบเบฑเบ‡เบกเบตเบซเบผเบฒเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบˆเบฐเบฎเบฝเบ™เบฎเบนเป‰เบˆเบฒเบเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ‚เบฝเบ™เป„เบงเป‰เบชเบญเบ‡เบชเบฒเบกเบ›เบตเบเปˆเบญเบ™เบ‚เป‰เบญเบเป€เบเบตเบ”.

เบ‚เบฝเบ™เป‚เบ”เบ Divi Kapoor เปƒเบ™เบ›เบต 2011, เบšเบปเบ”เบ„เบงเบฒเบก "เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” Linux Kernel เบ‚เบญเบ‡เบ—เปเปˆเปเบฅเบฐ FIFOsเปเบกเปˆเบ™เบžเบฒเบšเบฅเบงเบกเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡เบ—เปเปˆ Linux (เบกเบฒเบฎเบญเบ”เบ›เบฐเบˆเบธเบšเบฑเบ™) เป€เบฎเบฑเบ”เบงเบฝเบ. เบ เบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบเปˆเบฝเบงเบเบฑเบš linux เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบฎเบนเบšโ€‹เปเบšเบšโ€‹เบ—เปเปˆโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบžเบปเบงโ€‹เบžเบฑเบ™โ€‹, เบ—เบตเปˆโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบเบตเบ™โ€‹เบ‚เบญเบ‡โ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เบŠเบปเปˆเบงโ€‹เบ„เบฒเบงโ€‹; เปเบฅเบฐเบเบฑเบ‡เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบ—เปเปˆเบชเบปเปˆเบ‡เป„เบ›เป„เบเบˆเบฒเบ "เบเบฒเบ™เบฅเบฑเบญเบเปเบšเบšเบญเบฐเบ™เบธเบฅเบฑเบ" เปƒเบ™ kernel Unix เบชเบฐเบšเบฑเบšเบ—เบต XNUMX.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™