αžšαž”αŸ€αž”αžŠαŸ‚αž›αž”αŸ†αž–αž„αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„ Unix

αžšαž”αŸ€αž”αžŠαŸ‚αž›αž”αŸ†αž–αž„αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„ Unix
αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αŸ†αž–αž„αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž›αž™αžΌαž“αžΈαž€αŸ” αžαŸ’αž‰αž»αŸ†β€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αžαž€β€‹αž…αž·αžαŸ’αžβ€‹αž”αž“αŸ’αžαž·αž…β€‹αžŠαŸ‚αž›β€‹αž’αžαŸ’αžαž”αž‘β€‹αžαŸ’αž˜αžΈβ€‹αž˜αž½αž™β€‹αž˜αžΆαž“β€‹αž…αŸ†αžŽαž„β€‹αž‡αžΎαž„β€‹αžαžΆ "αžαžΎαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…αž“αŸ…αž€αŸ’αž“αž»αž„ Unix?Β» αž”αžΆαž“αž”αŸ’αžšαŸ‚αž€αŸ’αž›αžΆαž™ αž˜αž·αž“αž˜αžΆαž“ αž’αŸ†αž–αžΈαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž•αŸ’αž‘αŸƒαž€αŸ’αž“αž»αž„αŸ” αžαŸ’αž‰αž»αŸ†β€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αž…αž„αŸ‹β€‹αžŠαžΉαž„β€‹αž…αž„αŸ‹β€‹αžƒαžΎαž‰β€‹αž αžΎαž™β€‹αž”αžΆαž“β€‹αž‡αžΈαž€β€‹αžšαž€β€‹αž”αŸ’αžšαž—αž–β€‹αž…αžΆαžŸαŸ‹β€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αžŸαŸ’αžœαŸ‚αž„β€‹αžšαž€β€‹αž…αž˜αŸ’αž›αžΎαž™αŸ”

αžαžΎαž™αžΎαž„αž€αŸ†αž–αž»αž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž’αŸ’αžœαžΈ?

αž”αŸ†αž–αž„αŸ‹αž‚αžΊ "αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž€αžΆαžšαž…αŸ’αž“αŸƒαž”αŸ’αžšαžŒαž·αžαžŠαŸαžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αžαž“αŸ…αž€αŸ’αž“αž»αž„αž™αžΌαž“αžΈαž€" αžŠαŸ‚αž›αž‡αžΆαž›αž€αŸ’αžαžŽαŸˆαž€αŸ†αžŽαžαŸ‹αž“αŸƒαž‘αžŸαŸ’αžŸαž“αžœαž·αž‡αŸ’αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžšαž”αžŸαŸ‹αž™αžΌαž“αžΈαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΌαž…αŸ—αžšαž½αž˜αž‚αŸ’αž“αžΆ αž“αž·αž„αž–αžΆαž€αŸ’αž™αžŸαŸ’αž›αŸ„αž€αž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ‚αž›αž’αŸ’αž›αžΆαž”αŸ‹αžŸαŸ’αž‚αžΆαž›αŸ‹αŸ–

$ 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()αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž―αž€αžŸαžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαŸ” αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΌαž“αž˜αž½αž™αžŸαžšαžŸαŸαžšαž‘αŸ…αž’αŸ’αž“αž€αž–αžŽαŸŒαž“αžΆαž˜αž½αž™ αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αž‘αŸ€αžαž’αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαžΌαž…αž‚αŸ’αž“αžΆαž–αžΈαž’αŸ’αž“αž€αž–αžŽαŸŒαž“αžΆαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αžŸαŸ‚αž› "αž”αŸ’αžαžΌαžšαžˆαŸ’αž˜αŸ„αŸ‡" αž’αŸ’αž“αž€αž–αžŽαŸŒαž“αžΆ 2 αž“αž·αž„ 3 αž‡αžΆαž˜αž½αž™ dup4 αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‚αžΌαž•αŸ’αž‚αž„ stdin αž“αž·αž„ stdout αŸ”

αž”αžΎαž‚αŸ’αž˜αžΆαž“αž”αŸ†αž–αž„αŸ‹αž‘αŸ αžŸαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαžŸαžšαžŸαŸαžšαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αž‘αŸ…αž―αž€αžŸαžΆαžšαž˜αž½αž™ αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αžœαžΆαž‘αŸ…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αž‘αŸ€αž αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž―αž€αžŸαžΆαžšαŸ” αž‡αžΆαž›αž‘αŸ’αž’αž•αž› αž™αžΎαž„αž“αžΉαž„αžαŸ’αž‡αŸ‡αžαŸ’αž‡αžΆαž™αž’αž“αž’αžΆαž“ αž“αž·αž„αž‘αŸ†αž αŸ†αžαžΆαžŸαž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αžšαžΎαž“αŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αž‚αžΊαž›αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž€αžΆαžšαž‡αŸ€αžŸαžœαžΆαž„αž―αž€αžŸαžΆαžšαž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αŸ–

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αž–αŸ’αž™αžΆαž™αžΆαž˜αž’αžΆαž“αž–αžΈαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž‘αž‘αŸ read(2) αž“αžΉαž„αžšαžΆαžšαžΆαŸ†αž„αžšαž αžΌαžαžŠαž›αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αžΆαž“αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αž–αŸ’αž™αžΆαž™αžΆαž˜αžŸαžšαžŸαŸαžšαž‘αŸ…αž€αžΆαž“αŸ‹αž”αŸ†αž–αž„αŸ‹αž–αŸαž‰αž›αŸαž‰ write(2) αž“αžΉαž„αžšαžΆαžšαžΆαŸ†αž„αžšαž αžΌαžαžŠαž›αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΆαž“αž–αžΈαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαžŸαžšαžŸαŸαžšαŸ”

αžŠαžΌαž…αž‡αžΆαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžš POSIX αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž‘αŸ’αžšαž–αŸ’αž™αžŸαž˜αŸ’αž”αžαŸ’αžαž·αžŸαŸ†αžαžΆαž“αŸ‹αž˜αž½αž™αŸ– αž€αžΆαžšαžŸαžšαžŸαŸαžšαž‘αŸ…αž€αžΆαž“αŸ‹αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαžšαž αžΌαžαžŠαž›αŸ‹ PIPE_BUF αž”αŸƒ (αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹ 512) αžαŸ’αžšαžΌαžœαžαŸ‚αž‡αžΆαž’αžΆαžαžΌαž˜αž·αž€ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αžΆαž…αž‘αžΆαž€αŸ‹αž‘αž„αž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αžαžΆαž˜αžšαž™αŸˆαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αžαžΆαž˜αžšαž”αŸ€αž”αžŠαŸ‚αž›αž―αž€αžŸαžΆαžšαž’αž˜αŸ’αž˜αžαžΆ (αžŠαŸ‚αž›αž˜αž·αž“αž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž’αžΆαž“αžΆαž”αŸ‚αž”αž“αŸαŸ‡) αž˜αž·αž“αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“αŸ”

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž―αž€αžŸαžΆαžšαž’αž˜αŸ’αž˜αžαžΆ αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αž’αžΆαž…αžŸαžšαžŸαŸαžšαž›αž‘αŸ’αž’αž•αž›αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžšαž”αžŸαŸ‹αžœαžΆαž‘αŸ…αžœαžΆ αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αžœαžΆαž‘αŸ…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž¬αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αžšαž”αŸ€αž”αž”αŸ‰αžΆαžšαŸ‰αžΆαž‘αŸ‚αž›αžšαžΉαž„ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžšαž•αŸ’αžαž›αŸ‹αžŸαž‰αŸ’αž‰αžΆαžαžΆαž„αž€αŸ’αžšαŸ… (αžŠαžΌαž…αž‡αžΆ semaphore) αžŠαžΎαž˜αŸ’αž”αžΈαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αžŠαž›αŸ‹αž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αž’αŸ†αž–αžΈαž€αžΆαžšαž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαžŸαžšαžŸαŸαžš αž¬αž’αžΆαž“αŸ” Conveyors αž‡αž½αž™αžŸαž„αŸ’αžšαŸ’αž‚αŸ„αŸ‡αž™αžΎαž„αž–αžΈαž”αž‰αŸ’αž αžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αŸ”

αžαžΎαž™αžΎαž„αž€αŸ†αž–αž»αž„αžŸαŸ’αžœαŸ‚αž„αžšαž€αž’αŸ’αžœαžΈ?

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž–αž“αŸ’αž™αž›αŸ‹αž“αŸ…αž›αžΎαž˜αŸ’αžšαžΆαž˜αžŠαŸƒαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαŸ’αžšαž˜αŸƒαž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΌαž“αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αŸ” αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αŸ‚αž„αž…αŸ‚αž€αžŸαžαž·αž”αžŽαŸ’αžŠαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“ αž“αž·αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžαž·αŸ” αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αž»αžαž„αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜ αž“αž·αž„αž›αž»αž”αž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αŸαž‰αž–αžΈαžŸαžαž·αž”αžŽαŸ’αžŠαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αŸ” αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž§αž”αž€αžšαžŽαŸαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαžΎαž˜αŸ’αž”αžΈαž αŸ…αž˜αž»αžαž„αžΆαžšαž€αŸ†αž‘αž»αž„αž–αŸαž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž’αžΆαž“ αž“αž·αž„αžŸαžšαžŸαŸαžšαž›αžΎαž’αŸ’αž“αž€αž–αžŽαŸŒαž“αžΆαž―αž€αžŸαžΆαžšαŸ” αž αžΎαž™αž€αžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž’αžΆαž€αž”αŸ’αž”αž€αž·αžšαž·αž™αžΆαž–αž·αžŸαŸαžŸαžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž„αž›αžΎαŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αžšαž½αž…αžšαžΆαž›αŸ‹αž αžΎαž™ αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžΆαž€αžŸαž½αžšαž”αŸ’αžšαž—αž–αž€αžΌαžŠαž“αŸƒαžαžΊαžŽαŸ‚αž› αž€αŸ’αžšαŸ„αž˜αž–αž“αŸ’αž›αžΊαž…αž„αŸ’αž€αŸ€αž„αž—αŸ’αž›αžΊαž…αŸ’αž”αžΆαžŸαŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΆαž€αŸ‹ αž¬αž”αžŠαž·αžŸαŸαž’αž‚αŸ†αžšαžΌαž•αŸ’αž›αžΌαžœαž…αž·αžαŸ’αžαž˜αž·αž“αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αžšαžΌαžœαžαŸ’αžšαŸ€αž˜αžαŸ’αž›αž½αž“αž‡αžΆαž“αž·αž…αŸ’αž…αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž·αž“αž”αžΆαž“αžšαŸ†αž–αžΉαž„αž‘αž»αž€αŸ”

αžαžΎαž™αžΎαž„αž€αŸ†αž–αž»αž„αžšαž€αž˜αžΎαž›αž“αŸ…αž―αžŽαžΆ?

αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αžŠαžΉαž„αžαžΆαž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αžŸαŸ€αžœαž—αŸ…αžŠαŸαž›αŸ’αž”αžΈαž›αŸ’αž”αžΆαž‰αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸ…αž―αžŽαžΆαž‘αŸαŸ”αžŸαŸ€αžœαž—αŸ…αžŸαžαŸ’αžœαžαŸ„Β« αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΌαžŠαž”αŸ’αžšαž—αž– Unix 6 αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž’αžšαž‚αž»αžŽαž…αŸ†αž–αŸ„αŸ‡ αžŸαž˜αžΆαž‚αž˜αž”αŸαžαž·αž€αž—αžŽαŸ’αžŒαž™αžΌαž“αžΈαž€ αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αžαžΆαž˜αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αž αž”αŸ’αžšαž—αž–β€‹αž€αžΌαžŠ αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž€αŸ†αžŽαŸ‚αž…αžΆαžŸαŸ‹αžšαž”αžŸαŸ‹αž™αžΌαž“αžΈαž€αŸ”

αž€αžΆαžšαžŠαžΎαžšαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž”αžŽαŸ’αžŽαžŸαžΆαžš TUHS αž‚αžΊαžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž‘αŸ…αž‘αžŸαŸ’αžŸαž“αžΆαžŸαžΆαžšαž˜αž“αŸ’αž‘αžΈαžšαŸ” αž™αžΎαž„αž’αžΆαž…αž˜αžΎαž›αž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αžšαž”αžŸαŸ‹αž™αžΎαž„ αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž€αžΆαžšαž‚αŸ„αžšαž–αž…αŸ†αž–αŸ„αŸ‡αž€αž·αž…αŸ’αž…αžαž·αžαžαŸ†αž”αŸ’αžšαžΉαž„αž”αŸ’αžšαŸ‚αž„αž‡αžΆαž…αŸ’αžšαžΎαž“αž†αŸ’αž“αžΆαŸ†αžŠαžΎαž˜αŸ’αž”αžΈαž™αž€αž˜αž€αžœαž·αž‰αž“αžΌαžœαžŸαž˜αŸ’αž—αžΆαžšαŸˆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž”αž“αŸ’αžαž·αž…αž˜αŸ’αžαž„αŸ—αž–αžΈαž€αžΆαžŸαŸ‚αž αž“αž·αž„αž–αŸ’αžšαžΈαž“αž…αžΆαžŸαŸ‹αŸ” αž αžΎαž™β€‹αžαŸ’αž‰αž»αŸ†β€‹αžŠαžΉαž„β€‹αž™αŸ‰αžΆαž„β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž’αŸ†αž–αžΈβ€‹αž”αŸ†αžŽαŸ‚αž€β€‹αž‘αžΆαŸ†αž„αž“αŸ„αŸ‡β€‹αžŠαŸ‚αž›β€‹αž“αŸ…β€‹αž”αžΆαžαŸ‹αŸ”

αžŠαŸ„αž™αž–αŸαž‰αž…αž·αžαŸ’αžαž“αžΉαž„αž€αžΆαžšαž…αž„αŸ‹αžŠαžΉαž„αž…αž„αŸ‹αžƒαžΎαž‰αžšαž”αžŸαŸ‹αž™αžΎαž„αž’αŸ†αž–αžΈαž”αŸ’αžšαžœαžαŸ’αžαž·αž”αž»αžšαžΆαžŽαž“αŸƒαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„ αž™αžΎαž„αž’αžΆαž…αž˜αžΎαž›αžŸαŸ’αž“αžΌαž›αž‘αŸ†αž“αžΎαž”αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αŸ”

αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡, pipe αž‚αžΊαž‡αžΆαž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž›αŸαž 42 αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„ sysent[]. αž…αŸƒαžŠαž“αŸ’αž™?

αžαžΊαžŽαŸ‚αž› Unix αž”αŸ’αžšαž–αŸƒαžŽαžΈ (1970-1974)

αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αžšαž€αžƒαžΎαž‰αžŠαžΆαž“αžŽαžΆαž˜αž½αž™αž‘αŸαŸ” pipe(2) αž˜αž·αž“αž“αŸ…αž€αŸ’αž“αž»αž„ PDP-7 Unix (αžαŸ‚αž˜αž€αžšαžΆ 1970) αž¬αž“αŸ…αž€αŸ’αž“αž»αž„ αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αžŠαŸ†αž”αžΌαž„αžšαž”αžŸαŸ‹αž™αžΌαž“αžΈαž€ (αžαŸ‚αžœαž·αž…αŸ’αž†αž·αž€αžΆ 1971) αž¬αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž”αŸ’αžšαž—αž–αž˜αž·αž“αž–αŸαž‰αž›αŸαž‰ αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž–αžΈαžš (αž˜αž·αžαž»αž“αžΆ ៑៩៧្)αŸ”

TUHS αž’αŸ‡αž’αžΆαž„β€‹αžŠαžΌαž…αŸ’αž“αŸαŸ‡ Unix αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αžΈ (αžαŸ‚αž€αž»αž˜αŸ’αž—αŸˆ 1973) αž‚αžΊαž‡αžΆαž€αŸ†αžŽαŸ‚αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ†αž–αž„αŸ‹:

αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈ 1973 αž“αŸƒαž™αžΌαž“αžΈαž€αž‚αžΊαž‡αžΆαž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αžŠαŸ‚αž›αž˜αžΆαž“αžαžΊαžŽαŸ‚αž›αžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž§αž”αž€αžšαžŽαŸαž—αŸ’αž‡αžΆαž”αŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸαž‡αžΆαž€αŸ†αžŽαŸ‚αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ†αž–αž„αŸ‹αž•αž„αžŠαŸ‚αžšαŸ” αž€αŸ’αž“αž»αž„αž€αŸ†αž‘αž»αž„αž†αŸ’αž“αžΆαŸ† XNUMX αž€αžΆαžšαž„αžΆαžšαž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ‚αž›αž˜αŸ’αž’αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈ XNUMX αžαžΊαžŽαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‘αžΎαž„αžœαž·αž‰αž“αŸ…αž€αŸ’αž“αž»αž„ C αž αžΎαž™αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈ XNUMX αž“αŸƒαž™αžΌαž“αžΈαž€αž”αžΆαž“αž€αžΎαžαŸ”

αž’αŸ’αž“αž€αž’αžΆαž“αž˜αŸ’αž“αžΆαž€αŸ‹αž”αžΆαž“αžšαž€αžƒαžΎαž‰αž€αžΆαžšαžŸαŸ’αž€αŸ‚αž“αž―αž€αžŸαžΆαžšαžŠαŸ‚αž› Doug McIlroy αžŸαŸ’αž“αžΎαž‚αŸ†αž“αž·αžαž“αŸƒ "αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαžΌαž…αž‡αžΆαž‘αž»αž™αŸ„αžŸαž½αž“"αŸ”

αžšαž”αŸ€αž”αžŠαŸ‚αž›αž”αŸ†αž–αž„αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„ Unix
αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ€αžœαž—αŸ…αžšαž”αžŸαŸ‹ Brian Kernighanαž™αžΌαž“αžΈαž€αŸ– αž”αŸ’αžšαžœαžαŸ’αžαž· αž“αž·αž„αž’αž“αž»αžŸαŸ’αžŸαžΆαžœαžšαžΈαž™αŸβ€ αž”αŸ’αžšαžœαžαŸ’αžαž·αž“αŸƒαž€αžΆαžšαž›αŸαž…αž…αŸαž‰αž“αžΌαžœαž§αž”αž€αžšαžŽαŸαž”αž‰αŸ’αž‡αžΌαž“αž€αŸαžšαŸ€αž”αžšαžΆαž”αŸ‹αž’αŸ†αž–αžΈαž―αž€αžŸαžΆαžšαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžšαŸ– β€œβ€¦ αžœαžΆαž–αŸ’αž™αž½αžšαž“αŸ…αž›αžΎαž‡αž‰αŸ’αž‡αžΆαŸ†αž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαž·αž™αžΆαž›αŸαž™αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž“αŸ… Bell Labs αž’αžŸαŸ‹αžšαž™αŸˆαž–αŸαž› 30 αž†αŸ’αž“αžΆαŸ†β€αŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž”αž‘αžŸαž˜αŸ’αž—αžΆαžŸαž“αŸαž‡αžΆαž˜αž½αž™ McIlroyαž“αž·αž„αžšαžΏαž„αž˜αž½αž™αž‘αŸ€αžαž–αžΈ αžŸαŸ’αž“αžΆαžŠαŸƒαžšαž”αžŸαŸ‹ McIlroy αžŸαžšαžŸαŸαžšαž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ† ្០៑ៀ:

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž› Unix αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαŸ’αž›αž½αž“ αž…αŸ†αžŽαž„αŸ‹αž…αŸ†αžŽαžΌαž›αž…αž·αžαŸ’αžαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž…αŸ†αž–αŸ„αŸ‡ coroutines αž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžαŸ’αž‰αž»αŸ†αžŸαž»αŸ†αž±αŸ’αž™αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’ OS αž‚αžΊ Ken Thompson αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αžŸαžšαžŸαŸαžšαž‘αŸ…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αž‘αŸ…αž€αžΆαž“αŸ‹αž§αž”αž€αžšαžŽαŸαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž‘αŸ…αž€αžΆαž“αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž•αž„αžŠαŸ‚αžšαŸ” Ken αž‚αž·αžαžαžΆαžœαžΆαž’αžΆαž…αž‘αŸ…αžšαž½αž…αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆαž’αŸ’αž“αž€αžαžΌαž…αžαžΆαž… αž‚αžΆαžαŸ‹αž…αž„αŸ‹αž±αŸ’αž™αž‚αŸ’αžšαž”αŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαžΎαžšαžαž½αž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹αŸ” αžαžΎαž€αžΆαžšαžŸαžšαžŸαŸαžšαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αžšαžœαžΆαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž–αž·αžαž‡αžΆαž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž’αŸ†αž‡αžΆαž„αž€αžΆαžšαžŸαžšαžŸαŸαžšαž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžšαž€αž˜αŸ’αžšαž·αžαž˜αž’αŸ’αž™αž˜αž˜αŸ‚αž“αž‘αŸ? αž αžΎαž™αž˜αžΆαž“αžαŸ‚αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αžœαžΎαžŸαŸ†αžŽαžΎαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ "αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„" αž“αž·αž„αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ„αŸ‡ Ken αž”αžΆαž“αž›αžΆαž“αŸ‹αž˜αžΆαžαŸ‹αžαžΆ "αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž’αŸ’αžœαžΎαžœαžΆ!" αŸ”

αž αžΎαž™αž”αžΆαž“αž’αŸ’αžœαžΎαŸ” αž›αŸ’αž„αžΆαž…αžŠαŸαž˜αžΆαž“αž‡αŸ„αž‚αžœαžΆαžŸαž“αžΆαž˜αž½αž™ Ken αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαžΊαžŽαŸ‚αž› αž“αž·αž„αžŸαŸ‚αž› αž‡αž½αžŸαž‡αž»αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž‘αž‘αž½αž›αž™αž€αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž› (αžŠαŸ‚αž›αž’αžΆαž…αž˜αž€αž–αžΈαž”αŸ†αž–αž„αŸ‹) αž“αž·αž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžˆαŸ’αž˜αŸ„αŸ‡αž―αž€αžŸαžΆαžšαŸ” αž“αŸ…αžαŸ’αž„αŸƒαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž”αŸ†αž–αž„αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž™αŸ‰αžΆαž„αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž“αŸ…αž…αž»αž„αžŸαž”αŸ’αžαžΆαž αŸ αž›αŸαžαžΆαž’αž·αž€αžΆαžšαž”αžΆαž“αž”αŸ’αžšαžΎαž–αž½αž€αž‚αŸαžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‰αžΎαž―αž€αžŸαžΆαžšαž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžœαžΆαž™αž’αžαŸ’αžαž”αž‘αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αŸ” αž”αž“αŸ’αžαž·αž…αž€αŸ’αžšαŸ„αž™αž˜αž€ Ken αž”αžΆαž“αž‡αŸ†αž“αž½αžŸ API ដើម αž“αž·αž„αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž»αŸ†αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αŸ†αž–αž„αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αž“αž»αžŸαž‰αŸ’αž‰αžΆαžŸαŸ’αž’αžΆαžαž‡αžΆαž„αž˜αž»αž“ αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžαžΆαŸ†αž„αž–αžΈαž–αŸαž›αž“αŸ„αŸ‡αž˜αž€αŸ”

αž‡αžΆαž’αž€αž»αžŸαž› αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαžΊαžŽαŸ‚αž› Unix αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΆαžαŸ‹αž”αž„αŸ‹αŸ” αž αžΎαž™αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž™αžΎαž„αž˜αžΆαž“αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžαžΊαžŽαŸ‚αž›αžŸαžšαžŸαŸαžšαž‡αžΆ C αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αž½αž“αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ‚αžœαž·αž…αŸ’αž†αž·αž€αžΆ αž†αŸ’αž“αžΆαŸ† 1973 αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž…αŸαž‰αž˜αž€αž–αžΈαžšαž”αžΈαžαŸ‚αž˜αž»αž“αž–αŸαž›αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž‡αžΆαž•αŸ’αž›αžΌαžœαž€αžΆαžš αž αžΎαž™αž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αŸ†αž–αž„αŸ‹αž‘αŸαŸ” αžœαžΆαž‡αžΆαž€αžΆαžšαž’αžΆαžŽαž·αžαžŠαŸ‚αž›αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸ Unix αžšαžΏαž„αž–αŸ’αžšαŸαž„αž“αž·αž‘αžΆαž“αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΆαžαŸ‹αž”αž„αŸ‹ αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž‡αžΆαžšαŸ€αž„αžšαž αžΌαžαŸ”

αž™αžΎαž„αž˜αžΆαž“αž’αžαŸ’αžαž”αž‘αž―αž€αžŸαžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ pipe(2) αž–αžΈαž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž‘αžΆαŸ†αž„αž–αžΈαžš αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž―αž€αžŸαžΆαžš αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αžΈ (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αžΆαž€αŸ’αž™αž˜αž½αž™αž…αŸ†αž“αž½αž“ αž‚αžΌαžŸαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΈαž€αŸ’αžšαŸ„αž˜ "αžŠαŸ„αž™αžŠαŸƒ" αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš ^ H αž’αž˜αžŠαŸ„αž™αžŸαž‰αŸ’αž‰αžΆαž‚αžΌαžŸαž”αž‰αŸ’αž‡αžΆαž€αŸ‹!) αž”αŸ’αžšαžΌαžαžΌ-pipe(2) αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αžŸαžšαžŸαŸαžšβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„ assembler αž αžΎαž™β€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αž―αž€αžŸαžΆαžšβ€‹αž–αžŽαŸŒαž“αžΆβ€‹αžαŸ‚β€‹αž˜αž½αž™β€‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž”αžΆαž“β€‹αž•αŸ’αžαž›αŸ‹β€‹αž“αžΌαžœβ€‹αž˜αž»αžαž„αžΆαžšβ€‹αžŸαŸ’αž“αžΌαž›β€‹αžŠαŸ‚αž›β€‹αžšαŸ†αž–αžΉαž„β€‹αž‘αž»αž€β€‹αžšαž½αž…β€‹αž αžΎαž™αŸ–

αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž”αŸ†αž–αž„αŸ‹ αž”αž„αŸ’αž€αžΎαžαž™αž“αŸ’αžαž€αžΆαžš I/O αžŠαŸ‚αž›αž αŸ…αžαžΆαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαŸ” αž’αŸ’αž“αž€αž–αž·αž–αžŽαŸŒαž“αžΆαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž’αžΆαž“ αž“αž·αž„αžŸαžšαžŸαŸαžšαŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αžœαžΈαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‘αŸ…αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžš αžœαžΆαž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαž αžΌαžαžŠαž›αŸ‹ 504 αž”αŸƒ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžšαžŸαŸαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž’αžΆαž€αŸ” αž“αŸ…αž–αŸαž›αž’αžΆαž“αž–αžΈαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžš αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž‡αžΆαž”αŸ‹αž‚αžΆαŸ†αž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž™αž€αŸ”

αž“αŸ…αž†αŸ’αž“αžΆαŸ†αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αžαžΊαžŽαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‘αžΎαž„αžœαž·αž‰αž‡αžΆ C αž“αž·αž„ αž”αŸ†αž–αž„αŸ‹ (2) αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αž½αž“ αž‘αž‘αž½αž›αž”αžΆαž“αžšαžΌαž”αžšαžΆαž„αž‘αŸ†αž“αžΎαž”αžšαž”αžŸαŸ‹αžœαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž‚αŸ†αžšαžΌ "pipe(fildes)Β»:

αž€αžΆαžšαž αŸ…αžαžΆαž˜αž”αŸ’αžšαž–αŸαž“αŸ’αž’ αž”αŸ†αž–αž„αŸ‹ αž”αž„αŸ’αž€αžΎαžαž™αž“αŸ’αžαž€αžΆαžš I/O αžŠαŸ‚αž›αž αŸ…αžαžΆ αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αŸ” αž’αŸ’αž“αž€αž–αž·αž–αžŽαŸŒαž“αžΆαž―αž€αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž’αžΆαž“ αž“αž·αž„αžŸαžšαžŸαŸαžšαŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αžœαžΈαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‘αŸ…αž€αžΆαž“αŸ‹αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž“αŸ„αŸ‡ αž’αŸ’αž“αž€αž–αž·αž–αžŽαŸŒαž“αžΆαž”αžΆαž“αžαŸ’αžšαž‘αž”αŸ‹αž€αŸ’αž“αž»αž„ r1 (resp. fildes[1]) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎ αžŠαŸ‚αž›αž•αŸ’αž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαž αžΌαžαžŠαž›αŸ‹ 4096 αž”αŸƒ αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžšαžŸαŸαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž’αžΆαž€αŸ” αž“αŸ…αž–αŸαž›αž’αžΆαž“αž–αžΈαž”αŸ†αž–αž„αŸ‹ αž’αŸ’αž“αž€αž–αžŽαŸŒαž“αžΆαžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ… r0 (resp. fildes[0]) αž™αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ”

αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž”αŸ†αž–αž„αŸ‹αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹ αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž–αžΈαžš (αž¬αž…αŸ’αžšαžΎαž“) (αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž€αžΆαžšαž’αŸ†αž–αžΆαžœαž“αžΆαžœαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹ សម) αž“αžΉαž„αž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž”αŸ†αž–αž„αŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘ αž’αžΆαž“ ΠΈ សរសេរ.

αžŸαŸ‚αž›αž˜αžΆαž“αžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαžαŸ‹αž’αžΆαžšαŸαž›αžΈαž“αŸαž’αŸŠαŸ‚αžšαž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αž›αžαž—αŸ’αž‡αžΆαž”αŸ‹αžαžΆαž˜αžšαž™αŸˆαž”αŸ†αž–αž„αŸ‹αŸ”

αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αž‘αŸ…αž’αžΆαž“αž–αžΈαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž‘αž‘αŸ (αž˜αž·αž“αž˜αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž‡αžΆαž”αŸ‹αž‚αžΆαŸ†αž„) αžŠαŸ‚αž›αž˜αžΆαž“αž…αž»αž„αž˜αŸ’αžαžΆαž„ (αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž―αž€αžŸαžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘) αžαŸ’αžšαž‘αž”αŸ‹ "αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž―αž€αžŸαžΆαžš" αžœαž·αž‰αŸ” αžŸαžšαžŸαŸαžšαž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αžΎαž–αžΎαž‘αŸαŸ”

αž†αžΆαž”αŸ‹β€‹αž”αŸ†αž•αž»αž αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αŸ†αž–αž„αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€ αž™αŸ„αž„ αžŠαž›αŸ‹αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž“αŸƒαž™αžΌαž“αžΈαž€ (αžαŸ‚αž˜αž·αžαž»αž“αžΆ 1974) αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαžŸαŸ’αž‘αžΎαžšαžαŸ‚αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαŸ’αž›αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ” αž˜αžΆαž“β€‹αžαŸ‚β€‹αž˜αžαž·β€‹αž”αž“αŸ’αžαŸ‚αž˜ αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž€αžΆαžšβ€‹αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–β€‹αž›αžΎαž€β€‹αž‘αžΈβ€‹αž”αŸ’αžšαžΆαŸ†β€‹αž’αžΆαž…β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αžšαŸ†αž›αž„αŸ”

Unix αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™ (1975)

αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αžΆαž“αž€αžΌαžŠαž”αŸ’αžšαž—αž–αž™αžΌαž“αžΈαž€ αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™αŸ” (αž§αžŸαž—αžΆ 1975) αŸ” αžŸαžΌαž˜αžαŸ’αž›αŸ‚αž„αž’αŸ†αžŽαžšαž‚αž»αžŽαž™αŸ‰αžΆαž„αž‡αŸ’αžšαžΆαž›αž‡αŸ’αžšαŸ…αž…αŸ†αž–αŸ„αŸ‡ αžαŸ„ αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αžŸαŸ’αžœαŸ‚αž„αžšαž€αž‡αžΆαž„αž”αŸ’αžšαž—αž–αž“αŸƒαž€αŸ†αžŽαŸ‚αž˜αž»αž“αŸ—αŸ–

αž’αžŸαŸ‹αžšαž™αŸˆαž–αŸαž›αž‡αžΆαž…αŸ’αžšαžΎαž“αž†αŸ’αž“αžΆαŸ†αžŸαŸ€αžœαž—αŸ… αžαŸ„ αž‚αžΊαž‡αžΆαž―αž€αžŸαžΆαžšαžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αž“αŸ…αž›αžΎαžαžΊαžŽαŸ‚αž› Unix αžŠαŸ‚αž›αž˜αžΆαž“αž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ… Bell Labs αŸ” αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž‚αŸ’αžšαžΌαž”αž„αŸ’αžšαŸ€αž“αž”αŸ’αžšαžΎαž€αžΌαžŠαž”αŸ’αžšαž—αž–αžšαž”αžŸαŸ‹αžœαžΆαž€αŸαžŠαŸ„αž™ αž’αžΆαž‡αŸ’αž‰αžΆαž”αŸαžŽαŸ’αžŽαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž–αžΈαžšαž”αžΆαž“αžŠαž€αž…αŸαž‰αž“αžΌαžœαž›αž‘αŸ’αž’αž—αžΆαž–αž“αŸαŸ‡ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŸαŸ€αžœαž—αŸ…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™αž‡αžΆαž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαžŠαŸ„αž™αžαž»αžŸαž…αŸ’αž”αžΆαž”αŸ‹αŸ”

αžαŸ’αž„αŸƒαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž‘αž·αž‰αžŸαŸ€αžœαž—αŸ…αžŠαŸ‚αž›αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž‘αžΎαž„αžœαž·αž‰ αž‚αž˜αŸ’αžšαž”αžŠαŸ‚αž›αž–αžŽαŸŒαž“αžΆαžŸαž·αžŸαŸ’αžŸαž“αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžαžαž…αž˜αŸ’αž›αž„αŸ” αž αžΎαž™αžŸαžΌαž˜αž’αžšαž‚αž»αžŽαžŠαž›αŸ‹ Warren Toomey (αžŠαŸ‚αž›αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‚αž˜αŸ’αžšαŸ„αž„ TUHS) αž’αŸ’αž“αž€αž’αžΆαž…αž‘αžΆαž‰αž™αž€αž”αžΆαž“αŸ” αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™ αž”αŸ’αžšαž—αž– PDF. αžαŸ’αž‰αž»αŸ†β€‹αž…αž„αŸ‹β€‹αž•αŸ’αžŠαž›αŸ‹β€‹αž±αŸ’αž™β€‹αž’αŸ’αž“αž€β€‹αž“αžΌαžœβ€‹αž‚αŸ†αž“αž·αžβ€‹αž˜αž½αž™β€‹αž“αŸƒβ€‹αž€αžΆαžšβ€‹αžαž·αžβ€‹αžαŸ†β€‹αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“β€‹αž”αžΆαž“β€‹αž…αžΌαž›β€‹αž‘αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž―αž€αžŸαžΆαžšβ€‹αž“αŸαŸ‡β€‹:

αž‡αžΆαž„ 15 αž†αŸ’αž“αžΆαŸ†αž˜αž»αž“ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžœαžΆαž™αž”αž‰αŸ’αž…αžΌαž›αž€αŸ’αž“αž»αž„αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž“αŸƒαž€αžΌαžŠαž”αŸ’αžšαž—αž–αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™ αžαŸ„αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž…αžΌαž›αž…αž·αžαŸ’αžαž‚αž»αžŽαž—αžΆαž–αž“αŸƒαž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž–αžΈαž…αŸ†αž“αž½αž“αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž˜αž·αž“αžŸαŸ’αž‚αžΆαž›αŸ‹αŸ” TUHS αž˜αž·αž“αž‘αžΆαž“αŸ‹αž˜αžΆαž“αž“αŸ…αž‘αžΎαž™αž‘αŸ αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž˜αžΆαž“αžŸαž·αž‘αŸ’αž’αž·αž…αžΌαž›αž”αŸ’αžšαžΎαž”αŸ’αžšαž—αž–αž…αžΆαžŸαŸ‹αž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž†αŸ’αž“αžΆαŸ† 1988 αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαž€αžƒαžΎαž‰αž€αžΆαžŸαŸ‚αžαž…αžΆαžŸαŸ‹αž˜αž½αž™αžŠαŸ‚αž›αž˜αžΆαž“ 9 αž”αž‘αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž”αž˜αŸ’αžšαž»αž„αž‘αž»αž€αž–αžΈαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžš PDP11 αŸ” αžœαžΆαž–αž·αž”αžΆαž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΉαž„αžαžΆαžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž¬αž’αžαŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αžŠαžΎαž˜αžˆαžΎ /usr/src/ αž“αŸ…αžŠαžŠαŸ‚αž›αžŠαŸ‚αž›αž―αž€αžŸαžΆαžšαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž“αŸ…αž†αŸ’αž“αžΆαŸ† 1979 αžŠαŸ‚αž›αž˜αžΎαž›αž‘αŸ…αž”αž»αžšαžΆαžŽαŸ” αžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž–αžΈαžš αž¬αž‡αžΆαž“αž·αžŸαŸ’αžŸαž“αŸ’αž‘αžœαžαŸ’αžαž» PWB αžαŸ’αž‰αž»αŸ†αž‚αž·αžαžαžΆαŸ”

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž™αž€αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž αžΎαž™αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž”αŸ’αžšαž—αž–αžŠαŸ„αž™αžŠαŸƒαž‘αŸ…αž‡αžΆαžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™αŸ” αž•αŸ’αž“αŸ‚αž€αž“αŸƒαž€αžΌαžŠαž“αŸ…αžαŸ‚αžŠαžŠαŸ‚αž› αž•αŸ’αž“αŸ‚αž€αžαŸ’αžšαžΌαžœαž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž”αž“αŸ’αžαž·αž… αžŠαŸ„αž™αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαž‘αŸ†αž“αžΎαž” += αž‘αŸ…αž‡αžΆαž›αŸ‚αž„αž”αŸ’αžšαžΎ =+αŸ” αž’αŸ’αžœαžΈαž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž”αž…αŸ„αž›αž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰ αž αžΎαž™αž’αŸ’αžœαžΈαž˜αž½αž™αžαŸ’αžšαžΌαžœαžŸαžšαžŸαŸαžšαž‘αžΎαž„αžœαž·αž‰αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž…αŸ’αžšαžΎαž“αž–αŸαž€αž‘αŸαŸ”

αž αžΎαž™αžαŸ’αž„αŸƒαž“αŸαŸ‡αž™αžΎαž„αž’αžΆαž…αž’αžΆαž“αžαžΆαž˜αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαž“αŸ… TUHS αž“αžΌαžœαž€αžΌαžŠαž”αŸ’αžšαž—αž–αž“αŸƒαž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™αŸ” αž”αžŽαŸ’αžŽαžŸαžΆαžšαžŠαŸ‚αž› Dennis Ritchie αž˜αžΆαž“αžŠαŸƒ.

αžŠαŸ„αž™αžœαž·αž’αžΈαž“αŸαŸ‡ αž“αŸ… glance αžŠαŸ†αž”αžΌαž„ αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαž…αž˜αŸ’αž”αž„αž“αŸƒ C-code αž˜αž»αž“αžŸαž˜αŸαž™ 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 αž–αž½αž€αžœαžΆαžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ” αž‘αž„αŸ‹αž‡αžΆαžαž·αž’αŸŠαžΈαžŠαŸ’αžšαžΌαžŸαŸ‚αž“ 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;
}

αžŸαŸαž…αž€αŸ’αžαžΈαž’αž’αž·αž”αŸ’αž”αžΆαž™αž–αž·αž–αžŽαŸŒαž“αžΆαž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž’αŸ†αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžœαžΆβ€‹αž˜αž·αž“β€‹αž„αžΆαž™β€‹αžŸαŸ’αžšαž½αž›β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž™αž›αŸ‹β€‹αž€αžΌαžŠβ€‹αž“αŸ„αŸ‡β€‹αž‘αŸ αž˜αž½αž™β€‹αž•αŸ’αž“αŸ‚αž€β€‹αžŠαŸ„αž™β€‹αžŸαžΆαžšβ€‹αžšαž”αŸ€αž”β€‹β€αŸ”struct user uΒ» αž“αž·αž„αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ R0 ΠΈ R1 αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž“αž·αž„αžαž˜αŸ’αž›αŸƒαžαŸ’αžšαž‘αž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αž»αž…αŸ”

αžαŸ„αŸ‡αžŸαžΆαž€αž›αŸ’αž”αž„αž‡αžΆαž˜αž½αž™ ialloc() αžŠαžΆαž€αŸ‹αž“αŸ…αž›αžΎαžαžΆαžŸ ធ៊ីណូត (inode)αž“αž·αž„αžŠαŸ„αž™αž˜αžΆαž“αž‡αŸ†αž“αž½αž™ falloc() - αž‘αž»αž€αž–αžΈαžš αž―αž€αžŸαžΆαžš. αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αŸ’αž’ αž™αžΎαž„αž“αžΉαž„αž€αŸ†αžŽαžαŸ‹αž‘αž„αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž―αž€αžŸαžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαžΆαž‡αžΆαž…αž»αž„αž‘αžΆαŸ†αž„αž–αžΈαžšαž“αŸƒαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„ αž…αž„αŸ’αž’αž»αž›αž–αž½αž€αžœαžΆαž‘αŸ…αž’αŸŠαžΈαžŽαžΌαžŠαžŠαžΌαž…αž‚αŸ’αž“αžΆ (αžŠαŸ‚αž›αž…αŸ†αž“αž½αž“αž―αž€αžŸαžΆαžšαž™αŸ„αž„αž€αŸ’αž›αžΆαž™αž‡αžΆ 2) αž αžΎαž™αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž’αŸŠαžΈαžŽαžΌαžŠαžαžΆαž”αžΆαž“αž€αŸ‚αž”αŸ’αžšαŸ‚ αž“αž·αž„αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž…αŸ†αž–αŸ„αŸ‡αžŸαŸ†αžŽαžΎ αžαŸ’αž‰αž»αŸ†β€‹αžŠαžΆαž€αŸ‹() αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž›αžΌαžœαž˜αžΆαž“αž€αŸ†αž αž»αžŸαžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαž™αž…αŸ†αž“αž½αž“αž™αŸ„αž„αž“αŸ…αž€αŸ’αž“αž»αž„ inode αžαŸ’αž˜αžΈαŸ”

pipe() αžŠαž›αŸ‹β€‹αž–αŸαž›β€‹αž€αŸ†αžŽαžαŸ‹ R0 ΠΈ R1 αžαŸ’αžšαž‘αž”αŸ‹αž›αŸαžαž–αž·αž–αžŽαŸŒαž“αžΆαž―αž€αžŸαžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αžΆαž“ αž“αž·αž„αžŸαžšαžŸαŸαžšαŸ” falloc() αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ’αžšαž“αž·αž…αž‘αŸ…αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž―αž€αžŸαžΆαžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αŸ "αžαŸ’αžšαž‘αž”αŸ‹" αžαžΆαž˜αžšαž™αŸˆ u.u_ar0[R0] αž“αž·αž„αž’αŸ’αž“αž€αž–αž·αž–αžŽαŸŒαž“αžΆαž―αž€αžŸαžΆαžšαŸ” αž“αŸ„αŸ‡αž‚αžΊαž›αŸαžαž€αžΌαžŠαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ r file descriptor αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžΆαž“ αž“αž·αž„αž…αžΆαžαŸ‹αžαžΆαŸ†αž„αž’αŸ’αž“αž€αž–αžŽαŸŒαž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžšαžŸαŸαžšαžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž–αžΈ u.u_ar0[R0] αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž αŸ…αž›αžΎαž€αž‘αžΈαž–αžΈαžš falloc().

αžŠαžΆαž€αŸ‹αž‘αž„αŸ‹ FPIPEαžŠαŸ‚αž›αž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž”αŸ†αž–αž„αŸ‹ αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž₯αžšαž·αž™αžΆαž”αžαž“αŸƒαž˜αž»αžαž„αžΆαžš rdwr() αž€αŸ’αž“αž»αž„ sys2.cαžŠαŸ‚αž›αž αŸ…αž‘αž˜αŸ’αž›αžΆαž”αŸ‹ I/O αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αŸ–

/*
 * common code for read and write calls:
 * check permissions, set base, count, and offset,
 * and switch out to readi, writei, or pipe code.
 */
rdwr(mode)
{
    register *fp, m;

    m = mode;
    fp = getf(u.u_ar0[R0]);
        /* … */

    if(fp->f_flag&FPIPE) {
        if(m==FREAD)
            readp(fp); else
            writep(fp);
    }
        /* … */
}

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž˜αž»αžαž„αžΆαžš readp() Π² pipe.c αž’αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž”αŸ†αž–αž„αŸ‹αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž‡αžΆαž€αžΆαžšαž›αŸ’αž’αž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž˜αž»αž“αžŠαžΎαž˜αŸ’αž”αžΈαžαžΆαž˜αžŠαžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž–αžΈ writep(). αž‡αžΆαžαŸ’αž˜αžΈαž˜αŸ’αžαž„αž‘αŸ€αž αž€αžΌαžŠαž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰ αžŠαŸ„αž™αžŸαžΆαžšαž›αž€αŸ’αžαžŽαŸˆαž“αŸƒαž’αž“αž»αžŸαž‰αŸ’αž‰αžΆαž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž›αž»αž”αž…αŸ„αž›αŸ”

writep(fp)
{
    register *rp, *ip, c;

    rp = fp;
    ip = rp->f_inode;
    c = u.u_count;

loop:
    /* If all done, return. */

    plock(ip);
    if(c == 0) {
        prele(ip);
        u.u_count = 0;
        return;
    }

    /*
     * If there are not both read and write sides of the
     * pipe active, return error and signal too.
     */

    if(ip->i_count < 2) {
        prele(ip);
        u.u_error = EPIPE;
        psignal(u.u_procp, SIGPIPE);
        return;
    }

    /*
     * If the pipe is full, wait for reads to deplete
     * and truncate it.
     */

    if(ip->i_size1 == PIPSIZ) {
        ip->i_mode =| IWRITE;
        prele(ip);
        sleep(ip+1, PPIPE);
        goto loop;
    }

    /* Write what is possible and loop back. */

    u.u_offset[0] = 0;
    u.u_offset[1] = ip->i_size1;
    u.u_count = min(c, PIPSIZ-u.u_offset[1]);
    c =- u.u_count;
    writei(ip);
    prele(ip);
    if(ip->i_mode&IREAD) {
        ip->i_mode =& ~IREAD;
        wakeup(ip+2);
    }
    goto loop;
}

αž™αžΎαž„αž…αž„αŸ‹αžŸαžšαžŸαŸαžšαž”αŸƒαž‘αŸ…αž€αžΆαžšαž”αž‰αŸ’αž…αžΌαž›αž”αŸ†αž–αž„αŸ‹ u.u_count. αžŠαŸ†αž”αžΌαž„αž™αžΎαž„αžαŸ’αžšαžΌαžœαž…αžΆαž€αŸ‹αžŸαŸ„ inode (αžŸαžΌαž˜αž˜αžΎαž›αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ plock/prele).

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž…αŸ†αž“αž½αž“αž™αŸ„αž„ inode αŸ” αžŠαžšαžΆαž”αžŽαžΆαž…αž»αž„αž‘αžΆαŸ†αž„αž–αžΈαžšαž“αŸƒαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αž“αŸ…αžαŸ‚αž”αžΎαž€αž…αŸ†αž  αž”αž‰αŸ’αž‡αžšαž‚αž½αžšαžαŸ‚αž‡αžΆ 2αŸ” αž™αžΎαž„αž”αž“αŸ’αžαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžαŸ†αžŽαž˜αž½αž™ (αž–αžΈ rp->f_inode) αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž”αž‰αŸ’αž‡αžšαžαž·αž…αž‡αžΆαž„ 2 αž“αŸ„αŸ‡αžœαžΆαž‚αž½αžšαžαŸ‚αž˜αžΆαž“αž“αŸαž™αžαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž’αžΆαž“αž”αžΆαž“αž”αž·αž‘αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž”αŸ†αž–αž„αŸ‹αŸ” αž˜αŸ’αž™αŸ‰αžΆαž„β€‹αž‘αŸ€αž αž™αžΎαž„β€‹αž€αŸ†αž–αž»αž„β€‹αžαŸ‚β€‹αž–αŸ’αž™αžΆαž™αžΆαž˜β€‹αžŸαžšαžŸαŸαžšβ€‹αž‘αŸ…β€‹αž”αŸ†αž–αž„αŸ‹β€‹αžŠαŸ‚αž›β€‹αž”αž·αž‘β€‹αž‡αž·αžβ€‹αžŠαŸ‚αž›β€‹αž‡αžΆβ€‹αž€αŸ†αž αž»αžŸαŸ” αž›αŸαžαž€αžΌαžŠαž€αŸ†αž αž»αžŸαžŠαŸ†αž”αžΌαž„ EPIPE αž“αž·αž„αžŸαž‰αŸ’αž‰αžΆ SIGPIPE αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαŸ’αž›αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈ XNUMX αž“αŸƒαž™αžΌαž“αžΈαž€αŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆ conveyor αž”αžΎαž€αž…αŸ†αž αž€αŸαžŠαŸ„αž™αžœαžΆαž’αžΆαž…αž–αŸαž‰αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž™αžΎαž„αžŠαŸ„αŸ‡αžŸαŸ„ αž αžΎαž™αž…αžΌαž›αž‚αŸαž„αžŠαŸ„αž™αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αžΉαž„αž’αžΆαž“αž–αžΈαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„ αž“αž·αž„αž”αž„αŸ’αž€αžΎαž“αž‘αŸ†αž αŸ†αž‘αŸ†αž“αŸαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡αŸ” αž“αŸ…αž–αŸαž›αž™αžΎαž„αž—αŸ’αž‰αžΆαž€αŸ‹αž–αžΈαžŠαŸ†αžŽαŸαž€ αž™αžΎαž„αžαŸ’αžšαž›αž”αŸ‹αž‘αŸ…αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž–αŸ’αž™αž½αžšαžŸαŸ„αž˜αŸ’αžαž„αž‘αŸ€αž αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžœαžŠαŸ’αžαž“αŸƒαž€αžΆαžšαžŸαžšαžŸαŸαžšαžαŸ’αž˜αžΈαŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“αž€αž“αŸ’αž›αŸ‚αž„αž‘αŸ†αž“αŸαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ†αž–αž„αŸ‹αž“αŸ„αŸ‡ αž™αžΎαž„αžŸαžšαžŸαŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎ សរសេរ(). αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš i_size1 inode'a (αž‡αžΆαž˜αž½αž™αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž‘αž‘αŸαž’αžΆαž…αžŸαŸ’αž˜αžΎαž“αžΉαž„ 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 αž αžΎαž™αž–αŸ’αž™αžΆαž™αžΆαž˜αžŠαžΆαžŸαŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŽαžΆαž˜αž½αž™αžŠαŸ‚αž›αž…αž„αŸ‹αžŸαžšαžŸαŸαžšαž‘αŸ…αž”αŸ†αž–αž„αŸ‹αŸ” αž™αžΎαž„αžŠαžΉαž„αžαžΆαž“αŸ…αž–αŸαž›αžŠαŸ‚αž› conveyor αž–αŸαž‰αŸ” writep() αžŠαŸαž€αž›αž€αŸ‹αž“αŸ…αž›αžΎ ip+1. αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αž‚αžΊαž‘αž‘αŸ αž™αžΎαž„αž’αžΆαž…αžŠαžΆαžŸαŸ‹αžœαžΆαž±αŸ’αž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΎαž„αžœαž·αž‰αž“αžΌαžœαžœαžŠαŸ’αžαž“αŸƒαž€αžΆαžšαžŸαžšαžŸαŸαžšαžšαž”αžŸαŸ‹αžœαžΆαŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαžαŸ’αžšαžΌαžœαž’αžΆαž“αž‘αŸαž“αŸ„αŸ‡αŸ” readp() αž’αžΆαž…αž€αŸ†αžŽαžαŸ‹αž‘αž„αŸ‹αž‡αžΆαžαž· IREAD αž αžΎαž™αžŠαŸαž€αž›αž€αŸ‹ ip+2. αž™αžΎαž„αžŠαžΉαž„αžαžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αžΉαž„αžŠαžΆαžŸαŸ‹αž‚αžΆαžαŸ‹ writep()αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαžŸαžšαžŸαŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž½αž™αž…αŸ†αž“αž½αž“αž‘αŸ…αž”αŸ†αž–αž„αŸ‹αŸ”

αž˜αžαž·αž™αŸ„αž”αž›αŸ‹αž›αžΎ read() αž“αž·αž„ 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() αž…αžΆαž€αŸ‹αžŸαŸ„ 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() αž αŸ…αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αžšαž”αžŸαŸ‹αžœαžΆ, αž“αŸαŸ‡αŸ” plock(ip)αžŠαŸ‚αž›αž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž‡αžΆαž”αŸ‹αž‚αžΆαŸ†αž„αž”αŸ’αžšαžŸαž·αž“αž”αžΎ readp() αž˜αž·αž“β€‹αž‘αžΆαž“αŸ‹β€‹αž”αžΆαž“β€‹αž›αž»αž”β€‹αž”αŸ’αž›αž»αž€β€‹αž…αŸαž‰β€‹αž‘αŸ αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž€αžΌαžŠβ€‹αžαŸ’αžšαžΌαžœβ€‹αžαŸ‚β€‹αž’αŸ’αžœαžΎβ€‹αž€αžΆαžšβ€‹αž”αžΆαž“β€‹αžαŸ’αžšαžΉαž˜β€‹αžαŸ’αžšαžΌαžœαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž› wakeup()αžœαžΆαž…αŸ’αž”αžΆαžŸαŸ‹αžŽαžΆαžŸαŸ‹αžαžΆαžœαžΆαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαž‚αŸαž„αžαžΆαžšαž½αž…αžšαžΆαž›αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž–αŸαž›αž’αž“αžΆαž‚αž sched() αž–αž·αžαž‡αžΆαž”αžΆαž“αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ readp() αž˜αžΌαž›αž αŸαžαž» wakeup(), αžŠαŸ„αŸ‡αžŸαŸ„, αž€αŸ†αžŽαžαŸ‹ IREAD αž“αž·αž„αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαŸαž–αŸ’αž‘ sleep(ip+2)- αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡αž–αžΈαž˜αž»αž“ writep() αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžœαžŠαŸ’αžαž‘αžΎαž„αžœαž·αž‰αŸ”

αž“αŸαŸ‡αž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™αŸ” αž€αžΌαžŠαžŸαžΆαž˜αž‰αŸ’αž‰ αž’αžαŸ’αžαž“αŸαž™αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αŸ”

Unix αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž–αžΈαžš (αžαŸ‚αž˜αž€αžšαžΆ 1979) αž‚αžΊαž‡αžΆαž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αžŠαŸαžŸαŸ†αžαžΆαž“αŸ‹αžαŸ’αž˜αžΈαž˜αž½αž™ (αž”αž½αž“αž†αŸ’αž“αžΆαŸ†αž€αŸ’αžšαŸ„αž™αž˜αž€) αžŠαŸ‚αž›αžŽαŸ‚αž“αžΆαŸ†αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αž˜αžΈαŸ— αž“αž·αž„αž˜αž»αžαž„αžΆαžšαžαžΊαžŽαŸ‚αž›αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ” αžœαžΆαž€αŸαž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹αž•αž„αžŠαŸ‚αžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αŸ’αžšαž—αŸαž‘αž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹ αžŸαž αž‡αžΈαž– αž“αž·αž„αž€αžΆαžšαžœαžΆαž™αž”αž‰αŸ’αž…αžΌαž›αž‘αŸ’αžšαž“αž·αž…αž‘αŸ…αž“αžΉαž„αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž›αŸαžαž€αžΌαžŠαž”αŸ†αž–αž„αŸ‹ αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž˜αž·αž“αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸαŸ” αž™αžΎαž„αž’αžΆαž…αžšαŸ†αž›αž„αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž“αŸαŸ‡αž”αžΆαž“αŸ”

Xv6 αžŠαŸ‚αž›αž‡αžΆαžαžΊαžŽαŸ‚αž›αžŸαŸ’αžšαžŠαŸ€αž„αž“αžΉαž„αž™αžΌαž“αžΈαž€αžŸαžΆαž˜αž‰αŸ’αž‰

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžŸαŸ’αž“αžΌαž› Xv6 αžšαž„αž₯αž‘αŸ’αž’αž·αž–αž›αžŠαŸ„αž™αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™αž“αŸƒαž™αžΌαž“αžΈαž€ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‡αžΆ C αž‘αŸ†αž“αžΎαž”αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš x86 αŸ” αž€αžΌαžŠαž‚αžΊαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž’αžΆαž“ αž“αž·αž„αž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αŸ” αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž•αž„αžŠαŸ‚αžš αž˜αž·αž“αžŠαžΌαž…αž”αŸ’αžšαž—αž– Unix αž‡αžΆαž˜αž½αž™ TUHS αž‘αŸ αž’αŸ’αž“αž€αž’αžΆαž…αž…αž„αž€αŸ’αžšαž„αžœαžΆ αž€αŸ‚αž”αŸ’αžšαŸ‚αžœαžΆ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžœαžΆαž“αŸ…αž›αžΎαž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž€αŸ’αžšαŸ…αž–αžΈ PDP 11/70 αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž αžΎαž™ αžŸαŸ’αž“αžΌαž›αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž™αŸ‰αžΆαž„αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαžΆαž€αž›αžœαž·αž‘αŸ’αž™αžΆαž›αŸαž™αž‡αžΆαžŸαž˜αŸ’αž—αžΆαžšαŸˆαž”αž„αŸ’αžšαŸ€αž“αžŸαŸ’αžαžΈαž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαŸ” αž”αŸ’αžšαž—αž– αž˜αžΆαž“αž“αŸ…αž›αžΎ Github.

αž€αžΌαžŠαž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹ αž“αž·αž„αž‚αž·αžαž‚αžΌαžš αž”αŸ†αž–αž„αŸ‹.cαž‚αžΆαŸ†αž‘αŸ’αžšαžŠαŸ„αž™αžŸαžαž·αž”αžŽαŸ’αžŠαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αž€αŸ’αž“αž»αž„αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž’αŸŠαžΈαžŽαžΌαžαž“αŸ…αž›αžΎαžαžΆαžŸαŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αžαŸ‚αž“αž·αž™αž˜αž“αŸαž™αž“αŸƒ "αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’" αž“αž·αž„αž˜αž»αžαž„αžΆαžš 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. αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αžŽαŸ‚αž“αžΆαŸ†αž±αŸ’αž™αž’αžΆαž“αž€αžΌαžŠαžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ” αž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž‚αžΊαž“αŸ…αž€αž˜αŸ’αžšαž·αžαž“αŸƒαž€αžΌαžŠαž”αŸ’αžšαž—αž–αž“αŸƒαž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈ XNUMX αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž“αž·αž„αžšαžΈαž€αžšαžΆαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αžΆαž“αŸ”

αž›αžΈαž“αž»αž… 0.01

αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αžΌαžŠαž”αŸ’αžšαž—αž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αžΈαž“αž»αž… 0.01 αŸ” αžœαžΆαž“αžΉαž„αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαž·αž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžšαž”αžŸαŸ‹αž‚αžΆαžαŸ‹αŸ” fs/pipe.c. αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž’αŸŠαžΈαžŽαžΌαžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžαŸ†αžŽαžΆαž„αž±αŸ’αž™αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αžαŸ’αž›αž½αž“αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‡αžΆαž’αž€αŸ’αžŸαžš C αž‘αŸ†αž“αžΎαž”αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž›αž½αž…αž…αžΌαž›αžαžΆαž˜αžšαž™αŸˆαž›αŸαžαž€αžΌαžŠαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™ αž“αŸ„αŸ‡αž’αŸ’αž“αž€αž“αžΉαž„αž˜αž·αž“αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαž’αŸ’αžœαžΈαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‘αŸαŸ” αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž»αžαž„αžΆαžšαž˜αžΎαž›αž‘αŸ… 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. αž”αž“αŸ’αžαŸ‚αž˜αž–αžΈαž›αžΎαž€αžΆαžšαž„αžΆαžšαžŠαŸ„αž™αž”αŸƒαž”αŸƒαž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž‡αžΆαž˜αž½αž™αž‚αŸ†αž“αž·αžαžαžΆαž„αž›αžΎαŸ” αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆ sleep_on/wake_up αž˜αžΎαž›αž‘αŸ…αž˜αž·αž“αž…αž˜αŸ’αž›αŸ‚αž€αž‘αŸαŸ”

αžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž…αž‘αŸ†αž“αžΎαž”, FreeBSD, NetBSD, OpenBSD

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžαžΊαžŽαŸ‚αž›αž‘αŸ†αž“αžΎαž”αž˜αž½αž™αž…αŸ†αž“αž½αž“αž™αŸ‰αžΆαž„αž›αžΏαž“αŸ” αž‚αŸ’αž˜αžΆαž“αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜αž–αž½αž€αž‚αŸαž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŠαŸ‚αž›αž˜αžΆαž“αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž›αžΎαžαžΆαžŸ (αž˜αž·αž“αž‚αž½αžšαž±αŸ’αž™αž—αŸ’αž‰αžΆαž€αŸ‹αž•αŸ’αž’αžΎαž›αž‘αŸ) αŸ” αž›αžΈαž“αž»αž…αž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αŸ” αž αžΎαž™αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžαžΊαžŽαŸ‚αž› BSD αž‘αŸ†αž“αžΎαž”αž‘αžΆαŸ†αž„αž”αžΈαž˜αžΆαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΌαžŠαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαžŠαŸ„αž™ John Dyson αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αž†αŸ’αž“αžΆαŸ†αž˜αž€αž“αŸαŸ‡ αž–αž½αž€αž‚αŸαž”αžΆαž“αž€αŸ’αž›αžΆαž™αž‘αŸ…αž‡αžΆαžαž»αžŸαž‚αŸ’αž“αžΆαžαŸ’αž›αžΆαŸ†αž„αž–αžΈαž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αŸ”

αž’αžΆαž“ fs/pipe.c (αž“αŸ…αž›αžΎαž›αžΈαž“αž»αž…) ឬ sys/kern/sys_pipe.c (αž“αŸ…αž›αžΎ *BSD) αžœαžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αžΆαžšαž›αŸ‡αž”αž„αŸ‹αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαŸ” αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž αž“αž·αž„αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαžŠαžΌαž…αž‡αžΆαžœαŸ‰αž·αž…αž‘αŸαžš αž“αž·αž„αž’αžŸαž˜αž€αžΆαž› I/O αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž“αžΆαž–αŸαž›αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž“αŸαŸ‡αŸ” αž αžΎαž™αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž“αŸƒαž€αžΆαžšαž”αŸ‚αž„αž…αŸ‚αž€αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† αž€αžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„ αž“αž·αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαžΊαžŽαŸ‚αž› αž˜αžΆαž“αž—αžΆαž–αžαž»αžŸαž”αŸ’αž›αŸ‚αž€αž‚αŸ’αž“αžΆαž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αŸ” αž“αŸαŸ‡αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŸαžΆαž€αž›αžœαž·αž‘αŸ’αž™αžΆαž›αŸαž™αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαžŽαŸ‚αž“αžΆαŸ†αž’αŸ†αž–αžΈαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž“αŸ„αŸ‡αž‘αŸαŸ”

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŽαžΆαž€αŸαžŠαŸ„αž™ αžœαžΆαž‡αžΆαž€αžΆαžšαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž€αžƒαžΎαž‰αž‚αŸ†αžšαžΌαž…αžΆαžŸαŸ‹αŸ—αž˜αž½αž™αž…αŸ†αž“αž½αž“ (αž§αž‘αžΆαž αžšαžŽαŸ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž SIGPIPE αž“αž·αž„αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰ EPIPE αž“αŸ…αž–αŸαž›αžŸαžšαžŸαŸαžšαž‘αŸ…αž”αŸ†αž–αž„αŸ‹αž”αž·αž‘αž‡αž·αž) αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸαŸ‡ αžαž»αžŸαž‚αŸ’αž“αžΆαžαŸ’αž›αžΆαŸ†αž„αžŽαžΆαžŸαŸ‹ αžαžΊαžŽαŸ‚αž›αž‘αŸ†αž“αžΎαž”αŸ” αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαž˜αž·αž“αžŠαŸ‚αž›αžƒαžΎαž‰αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžš PDP-11 αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž˜αžΆαž“αž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαžšαŸ€αž“αž–αžΈαž€αžΌαžŠαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž–αžΈαžšαž”αžΈαž†αŸ’αž“αžΆαŸ†αž˜αž»αž“αžαŸ’αž‰αž»αŸ†αž€αžΎαžαŸ”

αž“αž·αž–αž“αŸ’αž’αžŠαŸ„αž™ Divi Kapoor αž€αŸ’αž“αž»αž„αž†αŸ’αž“αžΆαŸ† 2011 αž’αžαŸ’αžαž”αž‘ "αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžαžΊαžŽαŸ‚αž›αž›αžΈαž“αž»αž…αž“αŸƒαž”αŸ†αž–αž„αŸ‹ αž“αž·αž„ FIFOsαž‚αžΊαž‡αžΆαž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ…αž“αŸƒαžšαž”αŸ€αž”αžŠαŸ‚αž›αž”αŸ†αž–αž„αŸ‹αž›αžΈαž“αž»αž… (αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αž–αŸαž›αž“αŸαŸ‡) αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž€ αž€αžΆαžšαž”αŸ’αžαŸαž‡αŸ’αž‰αžΆαž…αž·αžαŸ’αžαžαŸ’αž˜αžΈαŸ—αž“αŸ…αž›αžΎαž›αžΈαž“αž»αž… αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž‚αŸ†αžšαžΌαž“αŸƒαž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž“αŸƒαž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„ αžŠαŸ‚αž›αžŸαž˜αžαŸ’αžαž—αžΆαž–αžšαž”αžŸαŸ‹αžœαžΆαž›αžΎαžŸαž–αžΈαž―αž€αžŸαžΆαžšαž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αŸ” αž αžΎαž™αž€αŸαž”αž„αŸ’αž αžΆαž‰αž•αž„αžŠαŸ‚αžšαžαžΆαžαžΎαž”αŸ†αž–αž„αŸ‹αž”αžΆαž“αž‘αŸ…αž†αŸ’αž„αžΆαž™αž”αŸ‰αž»αžŽαŸ’αžŽαžΆαž–αžΈ "αž€αžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„αžšαž”αŸ‚αž”αž’αž—αž·αžšαž€αŸ’αžŸ" αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž› Unix αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž›αžΎαž€αž‘αžΈαž”αŸ’αžšαžΆαŸ†αž˜αž½αž™αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹