ื•ื•ื™ ืคึผื™ื™ืคึผืœื™ื™ื ื– ื–ืขื ืขืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ ืื™ืŸ ื™ื•ื ื™ืงืก

ื•ื•ื™ ืคึผื™ื™ืคึผืœื™ื™ื ื– ื–ืขื ืขืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ ืื™ืŸ ื™ื•ื ื™ืงืก
ื“ืขืจ ืึทืจื˜ื™ืงืœ ื‘ืืฉืจื™ื™ื‘ื˜ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืคึผื™ื™ืคึผืœื™ื™ื ื– ืื™ืŸ ื“ื™ ื™ื•ื ื™ืงืก ืงืขืจืŸ. ืื™ืš ืื™ื– ื’ืขื•ื•ืขืŸ ืขืคึผืขืก ื“ื™ืกืึทืคึผื•ื™ื ื™ื“ ืึทื– ืึท ืคืจื™ืฉ ืึทืจื˜ื™ืงืœ ืžื™ื˜ืŸ ื˜ื™ื˜ืœ "ื•ื•ื™ ื˜ืึธืŸ ืคึผื™ื™ืคึผืœื™ื™ื ื– ืึทืจื‘ืขื˜ ืื™ืŸ ื™ื•ื ื™ืงืก?" ืื•ื™ืกื’ืขืงื•ืžืขืŸ ืงื™ื™ืŸ ื•ื•ืขื’ืŸ ื“ื™ ืื™ื ืขืจืœืขื›ืข ืกื˜ืจื•ืงื˜ื•ืจ. ืื™ืš ื‘ื™ืŸ ื’ืขื•ื•ืืจืŸ ื ื™ื™ื’ืขืจื™ื’ ืื•ืŸ ื”ืื‘ ืืจื™ื™ื ื’ืขื’ืจืื‘ืŸ ืื™ืŸ ืืœื˜ืข ืžืงื•ืจื•ืช ืฆื• ื’ืขืคื™ื ืขืŸ ื“ืขื ืขื ื˜ืคืขืจ.

ื•ื•ืึธืก ื–ืขื ืขืŸ ืžื™ืจ ื’ืขืจืขื“ื˜ ื•ื•ืขื’ืŸ?

ืคึผื™ื™ืคึผืœื™ื™ื ื– ื–ืขื ืขืŸ "ืžื™ืกื˜ืึธืžืข ื“ื™ ืžืขืจืกื˜ ื•ื•ื™ื›ื˜ื™ืง ื“ืขืจืคื™ื ื“ื•ื ื’ ืื™ืŸ ื™ื•ื ื™ืงืก" - ืึท ื“ื™ืคื™ื™ื ื™ื ื’ ืฉื˜ืจื™ืš ืคื•ืŸ ื™ื•ื ื™ืงืก ืก ืึทื ื“ืขืจืœื™ื™ื™ื ื’ ืคื™ืœืึธืกืึธืคื™ืข ืคื•ืŸ โ€‹โ€‹ืฉื˜ืขืœืŸ ืฆื•ื–ืึทืžืขืŸ ืงืœื™ื™ืŸ ืžื’ื™ืœื”, ืื•ืŸ ื“ื™ ื‘ืึทืงืึทื ื˜ืข ื‘ืึทืคึฟืขืœืŸ-ืฉื•ืจื” ืงืœื™ื ื’ื•ื•ืึธืจื˜:

$ 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 ืžื™ื˜ ื“ื•ืคึผ 4 ืฆื• ื’ืœื™ื™ึทื›ืŸ ืกื˜ื“ื™ืŸ ืื•ืŸ ืกื˜ื“ืึธื•ื˜.

ืึธืŸ ืคึผื™ื™ืคึผืœื™ื™ื ื–, ื“ื™ ืฉืึธืœ ื•ื•ืึธืœื˜ ื”ืึธื‘ืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ืื™ื™ืŸ ืคึผืจืึธืฆืขืก ืฆื• ืึท ื˜ืขืงืข ืื•ืŸ ืจืขืจ ืขืก ืฆื• ืืŸ ืื ื“ืขืจ ืคึผืจืึธืฆืขืก ืฆื• ืœื™ื™ืขื ืขืŸ ื“ื™ ื“ืึทื˜ืŸ ืคื•ืŸ ื“ืขืจ ื˜ืขืงืข. ื•ื•ื™ ืึท ืจืขื–ื•ืœื˜ืึทื˜, ืžื™ืจ ื•ื•ืึธืœื˜ ื•ื•ื™ืกื˜ ืžืขืจ ืจืขืกื•ืจืกืŸ ืื•ืŸ ื“ื™ืกืง ืคึผืœืึทืฅ. ืึธื‘ืขืจ, ืคึผื™ื™ืคึผืœื™ื™ื ื– ื–ืขื ืขืŸ ื’ื•ื˜ ืคึฟืึทืจ ืžืขืจ ื•ื•ื™ ื ืึธืจ ื•ื™ืกืžื™ื™ื“ืŸ ืฆื™ื™ึทื˜ื•ื•ื™ื™ึทืœื™ืง ื˜ืขืงืขืก:

ืื•ื™ื‘ ืึท ืคึผืจืึธืฆืขืก ืคืจื•ื•ื•ื˜ ืฆื• ืœื™ื™ืขื ืขืŸ ืคึฟื•ืŸ ืึท ืœื™ื™ื“ื™ืง ืจืขืจื  - ืœื™ื ื™ืข, ื“ืขืžืึธืœื˜ read(2) ื•ื•ืขื˜ ืคืึทืจืฉืคึผืึทืจืŸ ื‘ื™ื– ื“ื™ ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ื‘ื ื™ืžืฆื. ืื•ื™ื‘ ืึท ืคึผืจืึธืฆืขืก ืคืจื•ื•ื•ื˜ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืฆื• ืึท ืคื•ืœ ืจืขืจื  - ืœื™ื ื™ืข, ื“ืขืžืึธืœื˜ write(2) ื•ื•ืขื˜ ืคืึทืจืฉืคึผืึทืจืŸ ื‘ื™ื– ื’ืขื ื•ื’ ื“ืึทื˜ืŸ ืื™ื– ืœื™ื™ืขื ืขืŸ ืคื•ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ืฆื• ืคืึทืจืขื ื“ื™ืงืŸ ื“ื™ ืฉืจื™ื™ึทื‘ืŸ.

ื•ื•ื™ ื“ื™ POSIX ืคืึธื“ืขืจื•ื ื’, ื“ืึธืก ืื™ื– ืึท ื•ื•ื™ื›ื˜ื™ืง ืคืึทืจืžืึธื’: ืฉืจื™ื™ื‘ืŸ ืฆื• ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ืึทืจื•ื™ืฃ ืฆื• PIPE_BUF ื‘ื™ื˜ืขืก (ืœืคึผื—ื•ืช 512) ืžื•ื–ืŸ ื–ื™ื™ืŸ ืึทื˜ืึธืžื™ืฉืข ืึทื–ื•ื™ ืึทื– ืคึผืจืึทืกืขืกืึทื– ืงืขื ืขืŸ ื™ื‘ืขืจื’ืขื‘ืŸ ืžื™ื˜ ื™ืขื“ืขืจ ืื ื“ืขืจืข ื“ื•ืจืš ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ืื™ืŸ ืึท ื•ื•ืขื’ ืึทื– ื ืึธืจืžืึทืœ ื˜ืขืงืขืก (ื•ื•ืึธืก ื˜ืึธืŸ ื ื™ื˜ ืฆื•ืฉื˜ืขืœืŸ ืึทื–ืึท ื’ืขืจืึทื ื˜ื™ื–) ืงืขื ืขืŸ ื ื™ืฉื˜.

ืžื™ื˜ ืึท ืจืขื’ื•ืœืขืจ ื˜ืขืงืข, ืึท ืคึผืจืึธืฆืขืก ืงืขื ืขืŸ ืฉืจื™ื™ึทื‘ืŸ ืึทืœืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื–ื™ื™ึทืŸ ืจืขื–ื•ืœื˜ืึทื˜ ืฆื• ืขืก ืื•ืŸ ืคืึธืจืŸ ืขืก ืฆื• ืืŸ ืื ื“ืขืจ ืคึผืจืึธืฆืขืก. ืึธื“ืขืจ ืคึผืจืึทืกืขืกืึทื– ืงืขื ืขืŸ ืึทืจื‘ืขื˜ืŸ ืื™ืŸ ืึท ืฉื•ื•ืขืจ ืคึผืึทืจืึทืœืขืœ ืžืึธื“ืข, ื ื™ืฆืŸ ืึท ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ืกื™ื’ื ืึทืœื™ื ื’ ืžืขืงืึทื ื™ื–ืึทื (ื•ื•ื™ ืึท ืกืขืžืึทืคืึธืจ) ืฆื• ืžื™ื˜ื˜ื™ื™ืœืŸ ื™ืขื“ืขืจ ืื ื“ืขืจืข ื•ื•ืขื’ืŸ ื“ื™ ืงืึทืžืคึผืœื™ืฉืึทืŸ ืคื•ืŸ ืฉืจื™ื™ื‘ืŸ ืึธื“ืขืจ ืœื™ื™ืขื ืขืŸ. ืงืึทื ื•ื•ื™ื™ืขืจื– ืจืึทื˜ืขื•ื•ืขืŸ ืื•ื ื“ื– ืคื•ืŸ ืึทืœืข ื“ืขื ื›ืึทืกืึทืœ.

ื•ื•ืึธืก ื–ืขื ืขืŸ ืžื™ืจ ืงื•ืงืŸ ืคึฟืึทืจ?

ืื™ืš ื•ื•ืขืœ ื“ืขืจืงืœืขืจืŸ ืื•ื™ืฃ ืžื™ื™ืŸ ืคื™ื ื’ืขืจ ืฆื• ืžืึทื›ืŸ ืขืก ื’ืจื™ื ื’ืขืจ ืคึฟืึทืจ ืื™ืจ ืฆื• ื™ืžืึทื“ื–ืฉืึทืŸ ื•ื•ื™ ืึท ืงืึทื ื•ื•ื™ื™ืขืจ ืงืขื ืขืŸ ืึทืจื‘ืขื˜ืŸ. ืื™ืจ ื•ื•ืขื˜ ื“ืึทืจืคึฟืŸ ืฆื• ืึทืœืึทืงื™ื™ื˜ ืึท ื‘ืึทืคืขืจ ืื•ืŸ ืขื˜ืœืขื›ืข ืฉื˜ืึทื˜ ืื™ืŸ ื–ื›ึผืจื•ืŸ. ืื™ืจ ื•ื•ืขื˜ ื“ืึทืจืคึฟืŸ ืคืึทื ื’ืงืฉืึทื ื– ืฆื• ืœื™ื™ื’ืŸ ืื•ืŸ ื‘ืึทื–ื™ื™ึทื˜ื™ืงืŸ ื“ืึทื˜ืŸ ืคื•ืŸ ื“ื™ ื‘ืึทืคืขืจ. ืื™ืจ ื•ื•ืขื˜ ื“ืึทืจืคึฟืŸ ืขื˜ืœืขื›ืข ืžืขื›ื™ืจืขืก ืฆื• ืจื•ืคืŸ ืคืึทื ื’ืงืฉืึทื ื– ื‘ืขืฉืึทืก ืœื™ื™ืขื ืขืŸ ืื•ืŸ ืฉืจื™ื™ึทื‘ืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื– ืื•ื™ืฃ ื˜ืขืงืข ื“ื™ืกืงืจื™ืคึผื˜ืึธืจืก. ืื•ืŸ ืœืึทืงืก ื–ืขื ืขืŸ ื“ืืจืฃ ืฆื• ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ื™ ืกืคึผืขืฆื™ืขืœ ื ืึทื˜ื•ืจ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื•ื™ื‘ืŸ.

ืžื™ืจ ื–ืขื ืขืŸ ืื™ืฆื˜ ื’ืจื™ื™ื˜ ืฆื• ื•ื™ืกืคืึธืจืฉืŸ ื“ื™ ืžืงื•ืจ ืงืึธื“ ืคื•ืŸ ื“ื™ ืงืขืจืŸ ืื•ื ื˜ืขืจ ื”ืขืœ ืœืึธืžืคึผ ืœื™ื›ื˜ ืฆื• ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืึธื“ืขืจ ื“ื™ืกืคึผืจืึธื•ื•ืข ืื•ื ื“ื–ืขืจ ื•ื•ื™ื™ื’ ื’ื™ื™ึทืกื˜ื™ืง ืžืึธื“ืขืœ. ืึธื‘ืขืจ ืฉื˜ืขื ื“ื™ืง ื–ื™ื™ืŸ ืฆื•ื’ืขื’ืจื™ื™ื˜ ืคึฟืึทืจ ื“ื™ ืื•ืžื’ืขืจื™ื›ื˜.

ื•ื•ืื• ื–ื•ื›ืŸ ืžื™ืจ?

ืื™ืš ื•ื•ื™ื™ืก ื ื™ืฉื˜ ื•ื•ืื• ืขืก ืœื™ื’ื˜ ืžื™ื™ืŸ ืงืืคื™ ืคื•ื ืขื ื‘ืืจื™ืžื˜ืŸ ื‘ื•ืš.ืœื™ืึธื ืก ื‘ื•ืšยซ ืžื™ื˜ Unix 6 ืžืงื•ืจ ืงืึธื“, ืึธื‘ืขืจ ื“ืึทื ืง ืฆื• ื“ื™ ื™ื•ื ื™ืงืก ื”ืขืจื™ื˜ืึทื’ืข ื’ืขื–ืขืœืฉืืคื˜ ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื–ื•ื›ื˜ ืึธื ืœื™ื™ืŸ ืžืงื•ืจ ืงืึธื“ ืืคื™ืœื• ืขืœื˜ืขืจืข ื•ื•ืขืจืกื™ืขืก ืคื•ืŸ ื™ื•ื ื™ืงืก.

ื•ื•ืึทื ื“ืขืจื™ื ื’ ื“ื•ืจืš ื“ื™ TUHS ืึทืจืงื™ื™ื•ื•ื– ืื™ื– ื•ื•ื™ ืฆื• ื‘ืึทื–ื•ื›ืŸ ืึท ืžื•ื–ื™ื™. ืžื™ืจ ืงืขื ืขืŸ ืงื•ืงืŸ ืื™ืŸ ืื•ื ื“ื–ืขืจ ืฉืขืจื“ ื’ืขืฉื™ื›ื˜ืข ืื•ืŸ ืื™ืš ื”ืึธื‘ืŸ ืจืขืกืคึผืขืงื˜ ืคึฟืึทืจ ื“ื™ ื™ืึธืจืŸ ืคื•ืŸ ืžื™ ืฆื• ืฆื•ืจื™ืงืงืจื™ื’ืŸ ืึทืœืข ื“ืขื ืžืึทื˜ืขืจื™ืึทืœ ื‘ื™ืกืœ ื“ื•ืจืš ื‘ื™ืกืœ ืคื•ืŸ ืึทืœื˜ ืงืึทืกืขืฅ ืื•ืŸ ืคึผืจื™ื ื˜ืึทื•ื˜. ืื•ืŸ ืื™ืš ื‘ื™ืŸ ืึทืงื•ื˜ืข ืึทื•ื•ืขืจ ืคื•ืŸ ื“ื™ ืคืจืึทื’ืžืึทื ืฅ ื•ื•ืึธืก ื–ืขื ืขืŸ ื ืึธืš ืคืขืœื ื“ื™ืง.

ื•ื•ื™ื™ืœ ืฆื•ืคึฟืจื™ื“ืŸ ืื•ื ื“ื–ืขืจ ื ื™ื™ึทื’ืขืจื™ืงื™ื™ึทื˜ ื•ื•ืขื’ืŸ ื“ื™ ืืœื˜ืข ื’ืขืฉื™ื›ื˜ืข ืคื•ืŸ โ€‹โ€‹ืคึผื™ื™ืคึผืœื™ื™ื ื–, ืžื™ืจ ืงืขื ืขืŸ ืงื•ืงืŸ ืื™ืŸ ืžืึธื“ืขืจืŸ ืงืึธืจืขืก ืคึฟืึทืจ ืคืึทืจื’ืœื™ื™ึทืš.

ื“ื•ืจืš ื“ื™ ื•ื•ืขื’, pipe ืื™ื– ืกื™ืกื˜ืขื ืจื•ืคืŸ ื ื•ืžืขืจ 42 ืื™ืŸ ื“ื™ ื˜ื™ืฉ sysent[]. ืฆื•ืคืึทืœ?

ื˜ืจืึทื“ื™ืฆื™ืึธื ืขืœ ื™ื•ื ื™ืงืก ืงืขืจื ืึทืœื– (1970-1974)

ืื™ืš ื”ืึธื‘ ื ื™ื˜ ื’ืขืคึฟื•ื ืขืŸ ืงื™ื™ืŸ ืฉืคึผื•ืจ pipe(2) ืื•ื™ืš ื ื™ืฉื˜ ืื™ืŸ PDP-7 ื™ื•ื ื™ืงืก (ื™ืื ื•ืืจ 1970), ืื“ืขืจ ืื™ืŸ ืขืจืฉื˜ืขืจ ืึทื“ื™ืฉืึทืŸ ื™ื•ื ื™ืงืก (ื ืื•ื•ืขืžื‘ืขืจ 1971), ืื“ืขืจ ืื™ืŸ ื“ืขืจืขื ื“ื™ืงื˜ ืžืงื•ืจ ืงืึธื“ ืฆื•ื•ื™ื™ื˜ืข ืื•ื™ืกื’ืื‘ืข (ื™ื•ื ื™ 1972).

TUHS ืงืœื™ื™ืžื– ืึทื– ื“ืจื™ื˜ ืึทื“ื™ืฉืึทืŸ ื™ื•ื ื™ืงืก (ืคืขื‘ืจื•ืืจ 1973) ืื™ื– ื’ืขื•ื•ืขืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ื•ื•ืขืจืกื™ืข ืžื™ื˜ ืคึผื™ื™ืคึผืœื™ื™ื ื–:

ื“ื™ ื“ืจื™ื˜ ืึทื“ื™ืฉืึทืŸ ืคื•ืŸ ื™ื•ื ื™ืงืก ืื™ื– ื’ืขื•ื•ืขืŸ ื“ื™ ืœืขืฆื˜ืข ื•ื•ืขืจืกื™ืข ืžื™ื˜ ืึท ืงืขืจืŸ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ืึทืกืขืžื‘ืึทืœืœืขืจ, ืึธื‘ืขืจ ืื•ื™ืš ื“ืขืจ ืขืจืฉื˜ืขืจ ื•ื•ืขืจืกื™ืข ืžื™ื˜ ืคึผื™ื™ืคึผืœื™ื™ื ื–. ื‘ืขืฉืึทืก 1973, ืึทืจื‘ืขื˜ ืื™ื– ื’ืขื•ื•ืขืŸ ืึทื ื“ืขืจื•ื•ื™ื™ ืฆื• ืคึฟืึทืจื‘ืขืกืขืจืŸ ื“ื™ ื“ืจื™ื˜ ืึทื“ื™ืฉืึทืŸ, ื“ืขืจ ืงืขืจืŸ ืื™ื– ื’ืขื•ื•ืขืŸ ืจื™ืจื™ื™ื˜ ืื™ืŸ C, ืื•ืŸ ืึทื–ื•ื™ ื“ื™ ืคืขืจื˜ ืึทื“ื™ืฉืึทืŸ ืคื•ืŸ ื™ื•ื ื™ืงืก ืื™ื– ื’ืขื‘ื•ื™ืจืŸ.

ืื™ื™ืŸ ืœื™ื™ืขื ืขืจ ื’ืขืคื•ื ืขืŸ ืึท ื™ื‘ืขืจืงื•ืงืŸ ืคื•ืŸ ืึท ื“ืึธืงื•ืžืขื ื˜ ืื™ืŸ ื•ื•ืึธืก ื“ืึทื’ ืžืึทืงื™ืœืจื•ื™ ืคืืจื’ืขืœื™ื™ื’ื˜ ื“ืขื ื’ืขื“ืึทื ืง ืคื•ืŸ "ืคืึทืจื‘ื™ื ื“ืŸ ืžื’ื™ืœื” ื•ื•ื™ ืึท ื’ืึธืจื˜ืŸ ืงื™ืฉืงืข."

ื•ื•ื™ ืคึผื™ื™ืคึผืœื™ื™ื ื– ื–ืขื ืขืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ ืื™ืŸ ื™ื•ื ื™ืงืก
ืื™ืŸ Brian Kernighan ืก ื‘ื•ืšื™ื•ื ื™ืงืก: ื ื’ืขืฉื™ื›ื˜ืข ืื•ืŸ ืึท ืžืขืžืึธื™ืจ", ื“ื™ ื’ืขืฉื™ื›ื˜ืข ืคื•ืŸ โ€‹โ€‹ื“ืขืจ ืื•ื™ืกื–ืขืŸ ืคื•ืŸ ืงืึทื ื•ื•ื™ื™ืขืจื– ืื•ื™ืš ื“ืขืจืžืื ื˜ ื“ืขื ื“ืึธืงื•ืžืขื ื˜: "... ืขืก ืื™ื– ื’ืขื”ืื ื’ืขืŸ ืื•ื™ืฃ ื“ืขืจ ื•ื•ืึทื ื˜ ืื™ืŸ ืžื™ื™ืŸ ืึธืคื™ืก ืื™ืŸ ื‘ืขืœ ืœืึทื‘ืก ืคึฟืึทืจ 30 ื™ืึธืจ." ื“ืึธ ืื™ื ื˜ืขืจื•ื•ื™ื• ืžื™ื˜ McIlroyืื•ืŸ ื ืืš ื ืžืขืฉื” ืคื•ืŸ McIlroy ืก ื•ื•ืขืจืง, ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ 2014:

ื•ื•ืขืŸ ื™ื•ื ื™ืงืก ืืจื•ื™ืก, ืžื™ื™ืŸ ืœื™ื™ึทื“ื ืฉืึทืคื˜ ืคึฟืึทืจ ืงืึธืจืึธื•ื˜ื™ื ืขืก ื”ืึธื˜ ืžื™ืจ ื’ืขื‘ืขื˜ืŸ ื“ืขื ืึทืก ืžื—ื‘ืจ, Ken Thompson, ืฆื• ืœืึธื–ืŸ ื“ืึทื˜ืŸ ื’ืขืฉืจื™ื‘ืŸ ืฆื• ืขื˜ืœืขื›ืข ืคึผืจืึธืฆืขืก ืฆื• ื’ื™ื™ืŸ ื ื™ืฉื˜ ื‘ืœื•ื™ื– ืฆื• ื“ื™ ืžื™ื˜ืœ, ืึธื‘ืขืจ ืื•ื™ืš ืฆื• ื“ื™ ืึทืจื•ื™ืกื’ืึทื ื’ ืฆื• ืืŸ ืื ื“ืขืจ ืคึผืจืึธืฆืขืก. ืงืขืŸ ื‘ืึทืฉืœืึธืกืŸ ืึทื– ืขืก ืื™ื– ืžืขื’ืœืขืš. ืึธื‘ืขืจ, ื•ื•ื™ ืึท ืžื™ื ื™ืžืึทืœื™ืกื˜, ืขืจ ื’ืขื•ื•ืืœื˜ ืึทื– ื™ืขื“ืขืจ ืกื™ืกื˜ืขื ืฉื˜ืจื™ืš ื–ืึธืœ ืฉืคึผื™ืœืŸ ืึท ื‘ืึทื˜ื™ื™ื˜ื™ืง ืจืึธืœืข. ืื™ื– ื“ื™ืจืขืงื˜ ืฉืจื™ื™ื‘ืŸ ืฆื•ื•ื™ืฉืŸ ืคึผืจืึทืกืขืกืึทื– ื˜ืึทืงืข ืึท ื’ืจื•ื™ืก ืžื™ื™ึทืœืข ืื™ื‘ืขืจ ืฉืจื™ื™ื‘ืŸ ืฆื• ืึท ื™ื ื˜ืขืจืžื™ื“ื™ื™ื˜ ื˜ืขืงืข? ืื•ืŸ ื‘ืœื•ื™ื– ื•ื•ืขืŸ ืื™ืš ื’ืขืžืื›ื˜ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืคืึธืจืฉืœืึธื’ ืžื™ื˜ ื“ื™ ืงืึทื˜ืฉื™ ื ืึธืžืขืŸ "ืจืขืจื  - ืœื™ื ื™ืข" ืื•ืŸ ืึท ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ื“ื™ ืกื™ื ื˜ืึทืงืก ืคื•ืŸ ื“ื™ ื™ื ื˜ืขืจืึทืงืฉืึทืŸ ืคื•ืŸ ืคึผืจืึทืกืขืกืึทื–, ืงืขืŸ ืœืขืกืึธืฃ ื™ืงืกืงืœื™ื™ืžื“: "ืื™ืš ื•ื•ืขืœ ื˜ืึธืŸ ืขืก!".

ืื•ืŸ ื”ืื˜. ืื™ื™ืŸ ื’ื•ื™ืจืœื“ื™ืง ืึธื•ื•ื ื˜, Ken ื˜ืฉื™ื™ื ื“ื–ืฉื“ ื“ื™ ืงืขืจืŸ ืื•ืŸ ืฉืึธืœ, ืคืึทืจืคืขืกื˜ื™ืงื˜ ืขื˜ืœืขื›ืข ื ืึธืจืžืึทืœ ืžื’ื™ืœื” ืฆื• ืกื˜ืึทื ื“ืขืจื“ื™ื™ื– ื•ื•ื™ ื–ื™ื™ ืึธื ื ืขืžืขืŸ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ (ื•ื•ืึธืก ืงืขืŸ ืงื•ืžืขืŸ ืคื•ืŸ ืึท ืจืขืจื  - ืœื™ื ื™ืข), ืื•ืŸ ื˜ืฉื™ื™ื ื“ื–ืฉื“ ืคื™ืœืขื ืึทืžืขืก. ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ื˜ืึธื’, ืคึผื™ื™ืคึผืœื™ื™ื ื– ื–ืขื ืขืŸ ื–ื™ื™ืขืจ ื•ื•ื™ื™ื“ืœื™ ื’ืขื ื™ืฆื˜ ืื™ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ืกื•ืฃ ื•ื•ืืš ื”ืื‘ืŸ ื“ื™ ืกืขืงืจืขื˜ืืจืŸ ื–ื™ื™ ื’ืขื ื•ืฆื˜ ืฆื• ืฉื™ืงืŸ ื“ืืงื•ืžืขื ื˜ืŸ ืคื•ืŸ ื•ื•ืืจื˜ ืคืจืืกืขืกืืจืŸ ืฆื•ื ื“ืจื•ืงืขืจ. ืขืคึผืขืก ืฉืคึผืขื˜ืขืจ, Ken ืจื™ืคึผืœื™ื™ืกื˜ ื“ืขืจ ืึธืจื™ื’ื™ื ืขืœ ืึทืคึผื™ ืื•ืŸ ืกื™ื ื˜ืึทืงืก ืคึฟืึทืจ ืจืึทืคึผื™ื ื’ ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ืคึผื™ื™ืคึผืœื™ื™ื ื– ืžื™ื˜ ืงืœื™ื ืขืจ ืงืึทื ื•ื•ืขื ืฉืึทื ื– ื•ื•ืึธืก ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ื–ื™ื ื˜.

ืฆื•ื ื‘ืึทื“ื•ื™ืขืจืŸ, ื“ืขืจ ืžืงื•ืจ ืงืึธื“ ืคึฟืึทืจ ื“ื™ ื“ืจื™ื˜ ืึทื“ื™ืฉืึทืŸ ืคื•ืŸ ื™ื•ื ื™ืงืก ืงืขืจืŸ ืื™ื– ืคืึทืจืคืึทืœืŸ. ืื•ืŸ ื›ืึธื˜ืฉ ืžื™ืจ ื”ืึธื‘ืŸ ื“ื™ ืงืขืจืŸ ืžืงื•ืจ ืงืึธื“ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ C ืคืขืจื˜ืข ืื•ื™ืกื’ืื‘ืข, ื•ื•ืึธืก ืื™ื– ื‘ืืคืจื™ื™ื˜ ืื™ืŸ ื ืื•ื•ืขืžื‘ืขืจ 1973, ืึธื‘ืขืจ ืขืก ืื™ื– ืืจื•ื™ืก ืึท ื‘ื™ืกืœ ื—ื“ืฉื™ื ืื™ื™ื“ืขืจ ื“ืขืจ ื‘ืึทืึทืžื˜ืขืจ ืžืขืœื“ื•ื ื’ ืื•ืŸ ื˜ื•ื˜ ื ื™ืฉื˜ ืึทื ื˜ื”ืึทืœื˜ืŸ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืคึผื™ื™ืคึผืœื™ื™ื ื–. ืขืก ืื™ื– ืึท ืฉืึธื“ ืึทื– ื“ืขืจ ืžืงื•ืจ ืงืึธื“ ืคึฟืึทืจ ื“ืขื ืœืขื“ื–ืฉืึทื ื“ืขืจื™ ื™ื•ื ื™ืงืก ืฉื˜ืจื™ืš ืื™ื– ืคืึทืจืคืึทืœืŸ, ื˜ืึธืžืขืจ ืื•ื™ืฃ ืื™ื™ื‘ื™ืง.

ืžื™ืจ ื”ืึธื‘ืŸ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ื˜ืขืงืกื˜ ืคึฟืึทืจ pipe(2) ืคึฟื•ืŸ ื‘ื™ื™ื“ืข ืจื™ืœื™ืกื™ื–, ืึทื–ื•ื™ ืื™ืจ ืงืขื ืขืŸ ืึธื ื”ื™ื™ื‘ืŸ ื“ื•ืจืš ื–ื•ื›ืŸ ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ื“ืจื™ื˜ืข ืื•ื™ืกื’ืื‘ืข (ืคึฟืึทืจ ื’ืขื•ื•ื™ืกืข ื•ื•ืขืจื˜ืขืจ, ืื•ื ื˜ืขืจื’ืขืฉื˜ืจืึธื›ืŸ "ืžืึทื ื•ืึทืœื™", ืึท ืฉื˜ืจื™ืงืœ ืคื•ืŸ ^ื” ืœื™ื˜ืขืจืึทืœืŸ ื ืื›ื’ืขืคืืœื’ื˜ ืžื™ื˜ ืืŸ ืื•ื ื˜ืขืจืฉื˜ืจื™ื™ื›ืŸ!). ื“ืขื ืคึผืจืึธื˜ืึธ-pipe(2) ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ืึทืกืขืžื‘ืึทืœืœืขืจ ืื•ืŸ ืงืขืจื˜ ื‘ืœื•ื™ื– ืื™ื™ืŸ ื˜ืขืงืข ื“ื™ืกืงืจื™ืคึผื˜ืึธืจ, ืึธื‘ืขืจ ืฉื•ื™ืŸ ื’ื™ื˜ ื“ื™ ื“ืขืจื•ื•ืึทืจื˜ ื”ืึทืจืฅ ืคืึทื ื’ืงืฉืึทื ืึทืœื™ื˜ื™:

ืกื™ืกื˜ืขื ืจื•ืคืŸ ืจืขืจ ืงืจื™ื™ื™ืฅ ืึทืŸ I/O ืžืขืงืึทื ื™ื–ืึทื ื’ืขืจื•ืคืŸ ืึท ืจืขืจื  - ืœื™ื ื™ืข. ื“ืขืจ ืื•ืžื’ืขืงืขืจื˜ ื˜ืขืงืข ื“ื™ืกืงืจื™ืคึผื˜ืึธืจ ืงืขื ืขืŸ ื•ื•ืขืจืŸ ื’ืขื ื•ืฆื˜ ืคึฟืึทืจ ืœื™ื™ืขื ืขืŸ ืื•ืŸ ืฉืจื™ื™ึทื‘ืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื–. ื•ื•ืขืŸ ืขืคึผืขืก ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืฆื• ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข, ืขืก ื‘ืึทืคืขืจื– ืึทืจื•ื™ืฃ ืฆื• 504 ื‘ื™ื˜ืขืก ืคื•ืŸ ื“ืึทื˜ืŸ, ื ืึธืš ื•ื•ืึธืก ื“ื™ ืฉืจื™ื™ื‘ืŸ ืคึผืจืึธืฆืขืก ืื™ื– ืกื•ืกืคึผืขื ื“ืขื“. ื•ื•ืขืŸ ืœื™ื™ืขื ืขืŸ ืคื•ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข, ื“ื™ ื‘ืึทืคืขืจื“ ื“ืึทื˜ืŸ ืื™ื– ื’ืขื ื•ืžืขืŸ.

ืื™ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื™ืึธืจ, ื“ื™ ืงืขืจืŸ ืื™ื– ื’ืขื•ื•ืขืŸ ืจื™ืฉืจื™ื‘ืŸ ืื™ืŸ C, ืื•ืŸ ืจืขืจ (2) ืื™ืŸ ืคืขืจื˜ ืึทื“ื™ืฉืึทืŸ ืงื•ื ื” ื–ื™ื™ืŸ ืžืึธื“ืขืจืŸ ืงื•ืง ืžื™ื˜ ื“ื™ ืคึผืจืึธื•ื˜ืึทื˜ื™ื™ืคึผ "pipe(fildes)'

ืกื™ืกื˜ืขื ืจื•ืคืŸ ืจืขืจ ืงืจื™ื™ื™ืฅ ืึทืŸ I/O ืžืขืงืึทื ื™ื–ืึทื ื’ืขืจื•ืคืŸ ืึท ืจืขืจื  - ืœื™ื ื™ืข. ื“ื™ ืื•ืžื’ืขืงืขืจื˜ ื˜ืขืงืข ื“ื™ืกืงืจื™ืคึผื˜ืึธืจืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื™ืŸ ืœื™ื™ืขื ืขืŸ ืื•ืŸ ืฉืจื™ื™ึทื‘ืŸ ืึทืคึผืขืจื™ื™ืฉืึทื ื–. ื•ื•ืขืŸ ืขืคึผืขืก ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืฆื• ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข, ื“ืขืจ ื“ื™ืกืงืจื™ืคึผื˜ืึธืจ ืื•ืžื’ืขืงืขืจื˜ ืื™ืŸ r1 (ืจืขืกืคึผ. ืคื™ืœื“ืขืก [1]) ืื™ื– ื’ืขื ื™ืฆื˜, ื‘ืึทืคืขืจื“ ืึทืจื•ื™ืฃ ืฆื• 4096 ื‘ื™ื˜ืขืก ืคื•ืŸ ื“ืึทื˜ืŸ, ื ืึธืš ื•ื•ืึธืก ื“ื™ ืฉืจื™ื™ึทื‘ืŸ ืคึผืจืึธืฆืขืก ืื™ื– ืกื•ืกืคึผืขื ื“ืขื“. ื•ื•ืขืŸ ืœื™ื™ืขื ืขืŸ ืคื•ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข, ื“ื™ ื“ื™ืกืงืจื™ืคึผื˜ืึธืจ ืื•ืžื’ืขืงืขืจื˜ ืฆื• ืจ0 (ืจืขืกืคึผ. ืคื™ืœื“ืขืก [0]) ื ืขืžื˜ ื“ื™ ื“ืึทื˜ืŸ.

ืขืก ืื™ื– ืื ื’ืขื ื•ืžืขืŸ ืึทื– ืึทืžืึธืœ ืึท ืจืขืจื  - ืœื™ื ื™ืข ืื™ื– ื“ื™ืคื™ื™ื ื“, ืฆื•ื•ื™ื™ (ืึธื“ืขืจ ืžืขืจ) ื™ื ื˜ืขืจืึทืงื˜ื™ื ื’ ืคึผืจืึทืกืขืกืึทื– (ื‘ืืฉืืคืŸ ื“ื•ืจืš ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ื™ื ื•ื•ืึทืงื™ื™ืฉืึทื ื– ื’ืึธืคึผืœ) ื•ื•ืขื˜ ืคืึธืจืŸ ื“ืึทื˜ืŸ ืคื•ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ื ื™ืฆืŸ ืงืึทืœืœืก ืœื™ื™ืขื ืขืŸ ะธ ืฉืจื™ื™ึทื‘ืŸ.

ื“ื™ ืฉืึธืœ ื”ืื˜ ืึท ืกื™ื ื˜ืึทืงืก ืคึฟืึทืจ ื“ื™ืคื™ื™ื ื™ื ื’ ืึท ืœื™ื ืขืึทืจ ืžืขื ื’ืข ืคื•ืŸ โ€‹โ€‹ืคึผืจืึทืกืขืกืึทื– ืคืืจื‘ื•ื ื“ืŸ ื“ื•ืจืš ืึท ืจืขืจื  - ืœื™ื ื™ืข.

ืจื•ืคื˜ ืฆื• ืœื™ื™ืขื ืขืŸ ืคื•ืŸ ืึท ืœื™ื™ื“ื™ืง ืจืขืจื  - ืœื™ื ื™ืข (ืžื™ื˜ ืงื™ื™ืŸ ื‘ืึทืคืขืจื“ ื“ืึทื˜ืŸ) ื•ื•ืึธืก ื”ืื˜ ื‘ืœื•ื™ื– ืื™ื™ืŸ ืกื•ืฃ (ืึทืœืข ืฉืจื™ื™ึทื‘ืŸ ื˜ืขืงืข ื“ื™ืกืงืจื™ืคึผื˜ืึธืจืก ืคึฟืึทืจืžืึทื›ื˜) ืฆื•ืจื™ืงืงื•ืžืขืŸ "ืกื•ืฃ ืคื•ืŸ ื˜ืขืงืข". ืฉืจื™ื™ื‘ ืจื•ืคื˜ ืื™ืŸ ืึท ืขื ืœืขืš ืกื™ื˜ื•ืึทืฆื™ืข ื–ืขื ืขืŸ ืื™ื’ื ืึธืจื™ืจื˜.

ืขืจืœื™ืึทืกื˜ ืืคื’ืขื”ื™ื˜ ืจืขืจื  - ืœื™ื ื™ืข ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืึทืคึผืœื™ื™ื– ืฆื• ื“ื™ ืคื™ื ืคื˜ืข ืึทื“ื™ืฉืึทืŸ ืคื•ืŸ ื™ื•ื ื™ืงืก (ื™ื•ื ื™ 1974), ืึธื‘ืขืจ ืขืก ืื™ื– ื›ึผืžืขื˜ ื™ื™ื“ืขื ื™ืงืึทืœ ืฆื• ื“ืขืจ ื•ื•ืึธืก ืื™ื– ืืจื•ื™ืก ืื™ืŸ ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืžืขืœื“ื•ื ื’. ื‘ืœื•ื™ื– ืฆื•ื’ืขืœื™ื™ื’ื˜ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ, ืึทื–ื•ื™ ื“ื™ ืคื™ื ืคื˜ ืึทื“ื™ืฉืึทืŸ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืกืงื™ืคึผื˜.

ื™ื•ื ื™ืงืก ื–ืขืงืกื˜ ืึทื“ื™ืฉืึทืŸ (1975)

ืกื˜ืึทืจื˜ื™ื ื’ ืฆื• ืœื™ื™ืขื ืขืŸ Unix ืžืงื•ืจ ืงืึธื“ ื–ืขืงืกื˜ืข ืื•ื™ืกื’ืื‘ืข (ืžื™ื™ึท 1975). ืœืึทืจื’ืขืœื™ ื“ืึทื ืง ืฆื• ืœื™ืึธื ืก ืขืก ืื™ื– ืคื™ืœ ื’ืจื™ื ื’ืขืจ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ื•ื•ื™ ื“ื™ ืžืงื•ืจื™ื ืคื•ืŸ ืคืจื™ืขืจ ื•ื•ืขืจืกื™ืขืก:

ืคึฟืึทืจ ืคื™ืœืข ื™ืึธืจืŸ ื“ื™ ื‘ื•ืš ืœื™ืึธื ืก ืื™ื– ื’ืขื•ื•ืขืŸ ื“ืขืจ ื‘ืœื•ื™ื– ื“ืึธืงื•ืžืขื ื˜ ืื•ื™ืฃ ื“ื™ ื™ื•ื ื™ืงืก ืงืขืจืŸ ื‘ื ื™ืžืฆื ืึทืจื•ื™ืก ืคื•ืŸ ื‘ืขืœ ืœืึทื‘ืก. ื›ืึธื˜ืฉ ื“ื™ ื–ืขืงืกื˜ ืึทื“ื™ืฉืึทืŸ ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ื“ืขืจืœื•ื™ื‘ื˜ ืœืขืจืขืจืก ืฆื• ื ื•ืฆืŸ ื–ื™ื™ึทืŸ ืžืงื•ืจ ืงืึธื“, ื“ื™ ื–ื™ื‘ืขื˜ ืึทื“ื™ืฉืึทืŸ ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ื™ืงืกืงืœื•ื“ื™ื“ ื“ื™ ืžืขื’ืœืขื›ืงื™ื™ื˜, ืึทื–ื•ื™ ื“ืขืจ ื‘ื•ืš ืื™ื– ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืื™ืŸ ื•ืžืœืขื’ืึทืœ ื˜ื™ื™ืคึผ-ื’ืขืฉืจื™ื‘ืŸ ืงืึธืคึผื™ืขืก.

ื”ื™ื™ื ื˜ ืงืขืŸ ืžืขืŸ ืงื•ื™ืคืŸ ื ืื™ื‘ืขืจื“ืจื•ืงืŸ ืคื•ืŸ ื“ืขื ื‘ื•ืš, ืื•ื™ืฃ ื•ื•ืืก ื“ื™ ื“ืขืงืœ ืฉื™ืœื“ืขืจื˜ ื“ื™ ืกื˜ื•ื“ืขื ื˜ืŸ ื‘ื™ื™ ื“ื™ ืงืืคื™ืขืจ. ืื•ืŸ ื“ืึทื ืง ืฆื• Warren Toomey (ื•ื•ืึธืก ืกื˜ืึทืจื˜ืขื“ ื“ื™ TUHS ืคึผืจื•ื™ืขืงื˜), ืื™ืจ ืงืขื ืขืŸ ืืจืืคืงืืคื™ืข ื–ืขืงืกื˜ ืึทื“ื™ืฉืึทืŸ ืžืงื•ืจ ืคึผื“ืฃ. ืื™ืš ื•ื•ื™ืœืŸ ืฆื• ื’ืขื‘ืŸ ืื™ืจ ืึท ื’ืขื“ืึทื ืง ืคื•ืŸ ื•ื•ื™ ืคื™ืœ ืžื™ ืื™ื– ื’ืขื•ื•ืขืŸ ืื™ืŸ ืงืจื™ื™ื™ื˜ื™ื ื’ ื“ื™ ื˜ืขืงืข:

ืžื™ื˜ 15 ื™ืึธืจ ืฆื•ืจื™ืง, ืื™ืš ื˜ื™ื™ืคึผื˜ ืึท ืงืึธืคึผื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืžืงื•ืจ ืงืึธื“ ืฆื•ื’ืขืฉื˜ืขืœื˜ ืื™ืŸ ืœื™ืึธื ืกื•ื•ื™ื™ึทืœ ืื™ืš ื”ืื˜ ื ื™ื˜ ื•ื•ื™ ื“ื™ ืงื•ื•ืึทืœื™ื˜ืขื˜ ืคื•ืŸ ืžื™ื™ืŸ ืงืึธืคึผื™ืข ืคื•ืŸ โ€‹โ€‹ืึทืŸ ืื•ืžื‘ืึทืงืึทื ื˜ ื ื•ืžืขืจ ืคื•ืŸ ืื ื“ืขืจืข ืงืึธืคึผื™ืขืก. TUHS ื”ืื˜ ื ื™ืฉื˜ ืขืงืกื™ืกื˜ื™ืจืŸ ื ืึธืš, ืื•ืŸ ืื™ืš ื”ืื˜ ื ื™ืฉื˜ ื”ืึธื‘ืŸ ืฆื•ื˜ืจื™ื˜ ืฆื• ื“ื™ ืึทืœื˜ ืžืงื•ืจื™ื. ืึธื‘ืขืจ ืื™ืŸ 1988 ืื™ืš ื’ืขืคึฟื•ื ืขืŸ ืึทืŸ ืึทืœื˜ ื˜ืึทืฉืžืข ืžื™ื˜ 9 ื˜ืจืึทืงืก ื•ื•ืึธืก ื”ืื˜ ืึท ื‘ืึทืงืึทืคึผ ืคื•ืŸ ืึท PDP11 ืงืึธืžืคึผื™ื•ื˜ืขืจ. ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืฉื•ื•ืขืจ ืฆื• ื•ื•ื™ืกืŸ ืื•ื™ื‘ ืขืก ื’ืขืืจื‘ืขื˜, ืึธื‘ืขืจ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืึทืŸ ื‘ืขืฉืึธืœืขื /usr/src/ ื‘ื•ื™ื ืื™ืŸ ื•ื•ืึธืก ืจื•ื‘ึฟ ืคื•ืŸ ื“ื™ ื˜ืขืงืขืก ื–ืขื ืขืŸ ืื ื’ืขืฆื™ื™ื›ื ื˜ 1979, ื•ื•ืึธืก ืึทืคึฟื™ืœื• ื“ืขืžืึธืœื˜ ื’ืขืงื•ืงื˜ ืืœื˜ืข. ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื“ืขืจ ื–ื™ื‘ืขื˜ืขืจ ืึทื“ื™ืฉืึทืŸ, ืึธื“ืขืจ ืึท ืคึผื•ื•ื‘ ื“ืขืจื™ื•ื•ืึทื˜, ืื™ืš ื’ืขื“ืึทื ืง.

ืื™ืš ื”ืึธื‘ ื’ืขื ื•ืžืขืŸ ื“ืขื ื’ืขืคึฟื™ื ืขืŸ ื•ื•ื™ ืึท ื™ืงืขืจ ืื•ืŸ ืžืึทื ื™ื•ืึทืœื™ ืขื“ื™ื˜ื™ื“ ื“ื™ ืžืงื•ืจื™ื ืฆื• ื“ื™ ืฉื˜ืึทื˜ ืคื•ืŸ ื“ื™ ื–ืขืงืกื˜ ืึทื“ื™ืฉืึทืŸ. ื˜ื™ื™ืœ ืคื•ืŸ ื“ื™ ืงืึธื“ ืคืืจื‘ืœื™ื‘ืŸ ื“ื™ ื–ืขืœื‘ืข, ื˜ื™ื™ืœ ื”ืื˜ ืฆื• ื–ื™ื™ืŸ ืึท ื‘ื™ืกืœ ืขื“ื™ื˜ื™ื“, ื˜ืฉืึทื ื’ื™ื ื’ ื“ื™ ืžืึธื“ืขืจืŸ ืกื™ืžืขืŸ += ืฆื• ื“ื™ ืคืึทืจืขืœื˜ืขืจื˜ =+. ืขืคึผืขืก ืื™ื– ืคึผืฉื•ื˜ ืื•ื™ืกื’ืขืžืขืงื˜ ื’ืขื•ื•ืึธืจืŸ, ืื•ืŸ ืขืคึผืขืก ื”ืึธื˜ ืžืขืŸ ื’ืขืžื•ื–ื˜ ื’ืึธืจ ืื™ื‘ืขืจืฉืจืฒึทื‘ืŸ, ืึธื‘ืขืจ ื ื™ืฉื˜ ืฆื• ืคื™ืœ.

ืื•ืŸ ื”ื™ื™ึทื ื˜ ืžื™ืจ ืงืขื ืขืŸ ืœื™ื™ืขื ืขืŸ ืึธื ืœื™ื™ืŸ ื‘ื™ื™ TUHS ื“ื™ ืžืงื•ืจ ืงืึธื“ ืคื•ืŸ ื“ื™ ื–ืขืงืกื˜ ืึทื“ื™ืฉืึทืŸ ืคื•ืŸ ืืจื›ื™ื•ื•, ืฆื• ื•ื•ืขืœื›ืŸ ื“ืขื ื™ืก ืจื™ื˜ืฉื™ ื”ืื˜ ื’ืขื”ืื˜ ื ื”ืื ื˜.

ื“ื•ืจืš ื“ืขื ื•ื•ืขื’, ืื™ืŸ ืขืจืฉื˜ืขืจ ื‘ืœื™ืง, ื“ื™ ื”ื•ื™ืคึผื˜ ืฉื˜ืจื™ืš ืคื•ืŸ ื“ื™ 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 ื˜ืขืงืขืก, ื–ื™ื™ ืฉื˜ื™ืžืขืŸ ืฆื• ื™ื ืึธื“ืข-ืคืœืึทืš LARG, ื•ื•ืึธืก ืื™ื– ื’ืขื ื™ืฆื˜ ื“ื•ืจืš ื“ื™ "ื’ืจื•ื™ืก ืึทื“ืจืขืกื™ื ื’ ืึทืœื’ืขืจื™ื“ืึทื" ืฆื• ืคึผืจืึธืฆืขืก ื•ืžื“ื™ืจืขืงื˜ ื‘ืœืึทืงืก ืฆื• ืฉื˜ื™ืฆืŸ ื’ืจืขืกืขืจืข ื˜ืขืงืข ืกื™ืกื˜ืขืžืขืŸ. ื–ื™ื ื˜ ืงืขืŸ ื”ืื˜ ื’ืขื–ืื’ื˜ ืขืก ืื™ื– ื‘ืขืกืขืจ ื ื™ืฉื˜ ืฆื• ื ื•ืฆืŸ ื–ื™ื™, ืื™ืš ื‘ื™ืŸ ืฆื•ืคืจื™ื“ืŸ ืฆื• ื ืขืžืขืŸ ื–ื™ื™ืŸ ื•ื•ืึธืจื˜ ืคึฟืึทืจ ืื™ื.

ื“ืึธ ืื™ื– ื“ื™ ืคืึทืงื˜ื™ืฉ ืกื™ืกื˜ืขื ืจื•ืคืŸ pipe:

/*
 * The sys-pipe entry.
 * Allocate an inode on the root device.
 * Allocate 2 file structures.
 * Put it all together with flags.
 */
pipe()
{
    register *ip, *rf, *wf;
    int r;

    ip = ialloc(rootdev);
    if(ip == NULL)
        return;
    rf = falloc();
    if(rf == NULL) {
        iput(ip);
        return;
    }
    r = u.u_ar0[R0];
    wf = falloc();
    if(wf == NULL) {
        rf->f_count = 0;
        u.u_ofile[r] = NULL;
        iput(ip);
        return;
    }
    u.u_ar0[R1] = u.u_ar0[R0]; /* wf's fd */
    u.u_ar0[R0] = r;           /* rf's fd */
    wf->f_flag = FWRITE|FPIPE;
    wf->f_inode = ip;
    rf->f_flag = FREAD|FPIPE;
    rf->f_inode = ip;
    ip->i_count = 2;
    ip->i_flag = IACC|IUPD;
    ip->i_mode = IALLOC;
}

ื“ื™ ืงืึธืžืขื ื˜ืึทืจ ื‘ืืฉืจื™ื™ื‘ื˜ ืงืœืืจ ื•ื•ืึธืก ืื™ื– ื’ืขืฉืขืขื ื™ืฉ ื“ืึธ. ืึธื‘ืขืจ ืขืก ืื™ื– ื ื™ืฉื˜ ืึทื–ื•ื™ ื’ืจื™ื ื’ ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ืขื ืงืึธื“, ื˜ื™ื™ืœ ื•ื•ื™ื™ึทืœ ืคื•ืŸ ื•ื•ื™ "ืกื˜ืจื•ืงื˜ื•ืจ ื‘ืึทื ื™ืฆืขืจ ื•ยป ืื•ืŸ ืจืขื“ื–ืฉื™ืกื˜ืขืจื– R0 ะธ R1 ืกื™ืกื˜ืขื ืจื•ืคืŸ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืื•ืŸ ืฆื•ืจื™ืงืงื•ืžืขืŸ ื•ื•ืึทืœื•ืขืก ื–ืขื ืขืŸ ื“ื•ืจื›ื’ืขื’ืื ื’ืขืŸ.

ื–ืืœ ืก ืคึผืจื•ื‘ื™ืจืŸ ืžื™ื˜ ialloc() ืฉื˜ืขืœืŸ ืื•ื™ืฃ ื“ื™ืกืง ื™ื ืึธื“ืข (ื™ื ืึธื“ืข), ืื•ืŸ ืžื™ื˜ ื“ืขืจ ื”ื™ืœืฃ falloc() - ืงืจืึธื ืฆื•ื•ื™ื™ ื˜ืขืงืข. ืื•ื™ื‘ ืึทืœืฅ ื’ื™ื™ื˜ ื’ื•ื˜, ืžื™ืจ ืฉื˜ืขืœืŸ ืคืœืึทื’ืก ืฆื• ื™ื“ืขื ื˜ื™ืคื™ืฆื™ืจืŸ ื“ื™ ื˜ืขืงืขืก ื•ื•ื™ ื“ื™ ืฆื•ื•ื™ื™ ืขื ื“ืก ืคื•ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข, ื•ื•ื™ื™ึทื–ืŸ ื–ื™ื™ ืฆื• ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ื™ื ืึธื“ืข (ื•ื•ืขืžืขื ืก ืจืขืคึฟืขืจืขื ืฅ ืฆื™ื™ืœืŸ ื•ื•ืขืจื˜ 2), ืื•ืŸ ืฆื™ื™ื›ืŸ ื“ื™ ื™ื ืึธื“ืข ื•ื•ื™ ืžืึทื“ืึทืคื™ื™ื“ ืื•ืŸ ืื™ืŸ ื ื•ืฆืŸ. ื‘ืึทืฆืึธืœืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ึทื˜ ืฆื• ืจื™ืงื•ื•ืขืก ืฆื• ืื™ืš ืœื™ื™ื’() ืื™ืŸ ื˜ืขื•ืช ืคึผืึทื˜ืก ืฆื• ืคืึทืจืžื™ื ืขืจืŸ ื“ื™ ืจืขืคึฟืขืจืขื ืฅ ืฆื™ื™ืœืŸ ืื™ืŸ ื“ื™ ื ื™ื™ึทืข ื™ื ืึธื“ืข.

pipe() ืจืขื›ื˜ ื“ื•ืจืš R0 ะธ R1 ืฆื•ืจื™ืงืงื•ืžืขืŸ ื˜ืขืงืข ื“ื™ืกืงืจื™ืคึผื˜ืึธืจ ื ื•ืžืขืจืŸ ืคึฟืึทืจ ืœื™ื™ืขื ืขืŸ ืื•ืŸ ืฉืจื™ื™ื‘ืŸ. falloc() ืงืขืจื˜ ืึท ื˜ื™ื™ึทื˜ืœ ืฆื• ืึท ื˜ืขืงืข ืกื˜ืจื•ืงื˜ื•ืจ, ืึธื‘ืขืจ ืื•ื™ืš "ืงืขืจื˜" ื“ื•ืจืš u.u_ar0[R0] ืื•ืŸ ืึท ื˜ืขืงืข ื“ื™ืกืงืจื™ืคึผื˜ืึธืจ. ืึทื– ืื™ื–, ื“ื™ ืงืึธื“ ืื™ื– ืกื˜ืึธืจื“ ืื™ืŸ r ื˜ืขืงืข ื“ื™ืกืงืจื™ืคึผื˜ืึธืจ ืคึฟืึทืจ ืœื™ื™ืขื ืขืŸ ืื•ืŸ ืึทืกื™ื™ื ื“ ืึท ื“ื™ืกืงืจื™ืคึผื˜ืึธืจ ืคึฟืึทืจ ืฉืจื™ื™ื‘ืŸ ื’ืœื™ื™ึทืš ืคึฟื•ืŸ u.u_ar0[R0] ื ืึธืš ืฆื•ื•ื™ื™ื˜ืŸ ืจื•ืคืŸ falloc().

Flag FPIPE, ื•ื•ืึธืก ืžื™ืจ ืฉื˜ืขืœืŸ ื•ื•ืขืŸ ืงืจื™ื™ื™ื˜ื™ื ื’ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข, ืงืึธื ื˜ืจืึธืœืก ื“ื™ ื ืึทื˜ื•ืจ ืคื•ืŸ ื“ื™ ืคึฟื•ื ืงืฆื™ืข rdwr() ืื™ืŸ sys2.c, ื•ื•ืึธืก ืจื•ืคื˜ ืกืคึผืขืฆื™ืคื™ืฉ I / O ืจื•ื˜ื™ื ื–:

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

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

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

ื“ืขืจื ืึธืš ื“ื™ ืคึฟื•ื ืงืฆื™ืข readp() ะฒ pipe.c ืœื™ื™ืขื ื˜ ื“ืึทื˜ืŸ ืคื•ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข. ืื‘ืขืจ ืขืก ืื™ื– ื‘ืขืกืขืจ ืฆื• ืฉืคึผื•ืจ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืกื˜ืึทืจื˜ื™ื ื’ ืคื•ืŸ writep(). ื•ื•ื™ื“ืขืจ, ื“ืขืจ ืงืึธื“ ืื™ื– ื’ืขื•ื•ืืจืŸ ืžืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜ ืจืขื›ื˜ ืฆื• ื“ืขืจ ื ืึทื˜ื•ืจ ืคื•ืŸ ื“ื™ ืึทืจื’ื•ืžืขื ื˜ ื’ื™ื™ื˜ ืคืืจื‘ื™ื™ ืงืึทื ื•ื•ืขื ืฉืึทืŸ, ืึธื‘ืขืจ ืขื˜ืœืขื›ืข ื“ืขื˜ืึทื™ืœืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืื™ื‘ืขืจื’ืขื”ื™ืคึผืขืจื˜.

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

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

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

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

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

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

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

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

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

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

ืžื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื‘ื™ื˜ืขืก ืฆื• ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ u.u_count. ืขืจืฉื˜ืขืจ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืฉืœืึธืก ื“ื™ ื™ื ืึธื“ืข (ื–ืขืŸ ื•ื•ื™ื™ื˜ืขืจ plock/prele).

ื“ืขืจื ืึธืš ืžื™ืจ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ื™ ืฆื™ื™ืœืŸ ืคื•ืŸ ื™ื ืึธื“ืข ืจืขืคึฟืขืจืขื ืฅ. ื•ื•ื™ ืœืึทื ื’ ื•ื•ื™ ื‘ื™ื™ื“ืข ืขื ื“ืก ืคื•ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ื‘ืœื™ื™ื‘ืŸ ืึธืคืŸ, ื“ื™ ื˜ืึธืžื‘ืึทื ืง ื–ืึธืœ ื–ื™ื™ืŸ 2. ืžื™ืจ ื”ืึทืœื˜ืŸ ืื•ื™ืฃ ืื™ื™ืŸ ืœื™ื ืง (ืคื•ืŸ rp->f_inode), ืึทื–ื•ื™ ืื•ื™ื‘ ื“ื™ ื˜ืึธืžื‘ืึทื ืง ืื™ื– ื•ื•ื™ื™ื ื™ืงืขืจ ื•ื•ื™ 2, ื“ืึธืก ื–ืึธืœ ืžื™ื™ื ืขืŸ ืึทื– ื“ื™ ืœื™ื™ืขื ืขืŸ ืคึผืจืึธืฆืขืก ื”ืื˜ ืคืืจืžืื›ื˜ ื“ื™ ืกื•ืฃ ืคื•ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข. ืื™ืŸ ืื ื“ืขืจืข ื•ื•ืขืจื˜ืขืจ, ืžื™ืจ ื–ืขื ืขืŸ ื˜ืจื™ื™ื ื’ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืฆื• ืึท ืคืืจืžืื›ื˜ ืจืขืจื  - ืœื™ื ื™ืข, ื•ื•ืึธืก ืื™ื– ืึท ื’ืจื™ื™ึทื–. ืขืจืฉื˜ืขืจ ื˜ืขื•ืช ืงืึธื“ EPIPE ืื•ืŸ ืกื™ื’ื ืึทืœ SIGPIPE ืืจื•ื™ืก ืื™ืŸ ื“ืขืจ ื–ืขืงืกื˜ืขืจ ืึทื“ื™ืฉืึทืŸ ืคื•ืŸ ื™ื•ื ื™ืงืก.

ืื‘ืขืจ ืืคื™ืœื• ืื•ื™ื‘ ื“ื™ ืงืึทื ื•ื•ื™ื™ืขืจ ืื™ื– ืึธืคืŸ, ืขืก ืงืขืŸ ื–ื™ื™ืŸ ืคื•ืœ. ืื™ืŸ ื“ืขื ืคืึทืœ, ืžื™ืจ ื‘ืึทืคืจื™ื™ึทืขืŸ ื“ื™ ืฉืœืึธืก ืื•ืŸ ื’ื™ื™ืŸ ืฆื• ืฉืœืึธืคืŸ ืื™ืŸ ื“ืขืจ ื”ืึธืคืขื ื•ื ื’ ืึทื– ืืŸ ืื ื“ืขืจ ืคึผืจืึธืฆืขืก ื•ื•ืขื˜ ืœื™ื™ืขื ืขืŸ ืคื•ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ืื•ืŸ ืคืจื™ื™ ื’ืขื ื•ื’ ืคึผืœืึทืฅ ืื™ืŸ ืขืก. ื•ื•ืขืŸ ืžื™ืจ ื•ื•ืขืงืŸ ื–ื™ืš, ืžื™ืจ ืฆื•ืจื™ืงืงื•ืžืขืŸ ืฆื• ื“ื™ ืึธื ื”ื™ื™ื‘, ื”ืขื ื’ืขืŸ ื“ื™ ืฉืœืึธืก ื•ื•ื™ื“ืขืจ ืื•ืŸ ืึธื ื”ื™ื™ื‘ืŸ ืึท ื ื™ื™ึท ืฉืจื™ื™ึทื‘ืŸ ืฆื™ืงืœ.

ืื•ื™ื‘ ืขืก ืื™ื– ื’ืขื ื•ื’ ืคืจื™ื™ ืคึผืœืึทืฅ ืื™ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข, ืžื™ืจ ืฉืจื™ื™ึทื‘ืŸ ื“ืึทื˜ืŸ ืฆื• ืขืก ื ื™ืฆืŸ ืฉืจื™ื™ื‘ (). ืคึผืึทืจืึทืžืขื˜ืขืจ i_size1 ื“ื™ ื™ื ืึธื“ืข'ืึท (ืžื™ื˜ ืึท ืœื™ื™ื“ื™ืง ืจืขืจื  - ืœื™ื ื™ืข ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืœื™ื™ึทืš ืฆื• 0) ื•ื•ื™ื™ื–ื˜ ืฆื• ื“ื™ ืกื•ืฃ ืคื•ืŸ ื“ื™ ื“ืึทื˜ืŸ ื•ื•ืึธืก ืขืก ืฉื•ื™ืŸ ื›ึผื•ืœืœ. ืื•ื™ื‘ ืขืก ืื™ื– ื’ืขื ื•ื’ ืคึผืœืึทืฅ ืฆื• ืฉืจื™ื™ึทื‘ืŸ, ืžื™ืจ ืงืขื ืขืŸ ืคึผืœืึธืžื‘ื™ืจืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ืคื•ืŸ i_size1 ืฆื• PIPESIZ. ื“ืขืจื ืึธืš ืžื™ืจ ื‘ืึทืคืจื™ื™ึทืขืŸ ื“ื™ ืฉืœืึธืก ืื•ืŸ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื•ื•ืขืงืŸ ืึทืจื•ื™ืฃ ืงื™ื™ืŸ ืคึผืจืึธืฆืขืก ื•ื•ืึธืก ืื™ื– ื•ื•ืืจื˜ืŸ ืฆื• ืœื™ื™ืขื ืขืŸ ืคึฟื•ืŸ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข. ืžื™ืจ ื’ื™ื™ืŸ ืฆื•ืจื™ืง ืฆื• ื“ื™ ืึธื ื”ื™ื™ื‘ ืฆื• ื–ืขืŸ ืื•ื™ื‘ ืžื™ืจ ื’ืขืจืื˜ืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื•ื•ื™ ืคื™ืœืข ื‘ื™ื˜ืขืก ื•ื•ื™ ืžื™ืจ ื“ืืจืฃ. ืื•ื™ื‘ ืขืก ืคื™ื™ืœื–, ืžื™ืจ ืึธื ื”ื™ื™ื‘ืŸ ืึท ื ื™ื™ึทืข ืจืขืงืึธืจื“ื™ื ื’ ืฆื™ืงืœ.

ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ืคึผืึทืจืึทืžืขื˜ืขืจ i_mode inode ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ืงืจืึธื ืคึผืขืจืžื™ืฉืึทื ื– r, w ะธ x. ืึธื‘ืขืจ ืื™ืŸ ื“ืขื ืคืึทืœ ืคื•ืŸ ืคึผื™ื™ืคึผืœื™ื™ื ื–, ืžื™ืจ ืกื™ื’ื ืึทืœ ืึทื– ืขื˜ืœืขื›ืข ืคึผืจืึธืฆืขืก ืื™ื– ื•ื•ืืจื˜ืŸ ืคึฟืึทืจ ืึท ืฉืจื™ื™ึทื‘ืŸ ืึธื“ืขืจ ืœื™ื™ืขื ืขืŸ ืžื™ื˜ ื‘ื™ื˜ืŸ IREAD ะธ IWRITE ืจื™ืกืคึผืขืงื˜ื™ื•ื•ืœื™. ื“ืขืจ ืคึผืจืึธืฆืขืก ืฉื˜ืขืœื˜ ื“ื™ ืคืึธืŸ ืื•ืŸ ืจื•ืคื˜ sleep(), ืื•ืŸ ืขืก ืื™ื– ื“ืขืจื•ื•ืึทืจื˜ ืึทื– ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜ ืขื˜ืœืขื›ืข ืื ื“ืขืจืข ืคึผืจืึธืฆืขืก ื•ื•ืขื˜ ืจื•ืคืŸ wakeup().

ื“ื™ ืคืึทืงื˜ื™ืฉ ืžืึทื’ื™ืฉ ื›ืึทืคึผืึทื ื– ืื™ืŸ sleep() ะธ wakeup(). ื–ื™ื™ ื–ืขื ืขืŸ ื™ืžืคึผืœืึทืžืขื ืึทื“ ืื™ืŸ ืกืœืคึผ.ืง, ื“ืขืจ ืžืงื•ืจ ืคื•ืŸ ื“ื™ ื‘ืึทืจื™ืžื˜ "ืื™ืจ ื–ืขื ื˜ ื ื™ืฉื˜ ื“ืขืจื•ื•ืึทืจื˜ ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ืขื" ื‘ืึทืžืขืจืงื•ื ื’. ืฆื•ืž ื’ืœื™ืง, ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื“ืขื ืงืึธื“, ื ืึธืจ ืงื•ืง ืื™ืŸ ืขื˜ืœืขื›ืข ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ:

/*
 * 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 ืื™ืŸ ื“ืขืจ ืื™ื ืึธื“. ืžื™ืจ ื‘ืึทืฉื˜ืขื˜ื™ืง ื“ื™ ืฉื˜ืขืœืข ืฆื• 0 ืื•ืŸ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื•ื•ืขืงืŸ ื–ื™ืš ืงื™ื™ืŸ ืคึผืจืึธืฆืขืก ื•ื•ืึธืก ื•ื•ื™ืœ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืฆื• ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข. ืžื™ืจ ื•ื•ื™ืกืŸ ืึทื– ื•ื•ืขืŸ ื“ื™ ืงืึทื ื•ื•ื™ื™ืขืจ ืื™ื– ืคื•ืœ, writep() ืฉืœืึธืคื ื“ื™ืง ืื•ื™ืฃ ip+1. ืื•ืŸ ืื™ืฆื˜ ืึทื– ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ืื™ื– ืœื™ื™ื“ื™ืง, ืžื™ืจ ืงืขื ืขืŸ ื•ื•ืขืงืŸ ืขืก ืฆื• ื ืขืžืขื  ื–ื™ื› ื•ื•ื™ื“ืขืจ ื“ื™ ืฉืจื™ื™ึทื‘ืŸ ืฆื™ืงืœ.

ืื•ื™ื‘ ืขืก ืื™ื– ื’ืึธืจื ื™ืฉื˜ ืฆื• ืœื™ื™ืขื ืขืŸ, ื“ืขืžืึธืœื˜ readp() ืงืขื ืขืŸ ืฉื˜ืขืœืŸ ืึท ืคืึธืŸ IREAD ืื•ืŸ ืฉืœืึธืคื ื“ื™ืง ืื•ื™ืฃ ip+2. ืžื™ืจ ื•ื•ื™ื™ืกืŸ ื•ื•ืึธืก ื•ื•ืขื˜ ืื™ื ื“ืขืจื•ื•ืขืงืŸ writep()ื•ื•ืขืŸ ืขืก ืฉืจื™ื™ื‘ื˜ ืขื˜ืœืขื›ืข ื“ืึทื˜ืŸ ืฆื• ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข.

ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ืื•ื™ืฃ ืœื™ื™ืขื ืขืŸ () ืื•ืŸ ืฉืจื™ื™ึทื‘ืŸ () ื•ื•ืขื˜ ื”ืขืœืคึฟืŸ ืื™ืจ ืคึฟืึทืจืฉื˜ื™ื™ืŸ ืึทื– ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ืคืึธืจืŸ ืคึผืึทืจืึทืžืขื˜ืขืจืก ื“ื•ืจืš "uยป ืžื™ืจ ืงืขื ืขืŸ ืžื™ื™ึทื›ืœ ื–ื™ื™ ื•ื•ื™ ืจืขื’ื•ืœืขืจ ื™ / ืึธ ืคืึทื ื’ืงืฉืึทื ื– ื•ื•ืึธืก ื ืขืžืขืŸ ืึท ื˜ืขืงืข, ืึท ืฉื˜ืขืœืข, ืึท ื‘ืึทืคืขืจ ืื™ืŸ ื–ื›ึผืจื•ืŸ, ืื•ืŸ ืฆื™ื™ืœืŸ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ื‘ื™ื˜ืขืก ืฆื• ืœื™ื™ืขื ืขืŸ ืึธื“ืขืจ ืฉืจื™ื™ึทื‘ืŸ.

/*
 * Read the file corresponding to
 * the inode pointed at by the argument.
 * The actual read arguments are found
 * in the variables:
 *    u_base        core address for destination
 *    u_offset    byte offset in file
 *    u_count        number of bytes to read
 *    u_segflg    read to kernel/user
 */
readi(aip)
struct inode *aip;
/* โ€ฆ */

/*
 * Write the file corresponding to
 * the inode pointed at by the argument.
 * The actual write arguments are found
 * in the variables:
 *    u_base        core address for source
 *    u_offset    byte offset in file
 *    u_count        number of bytes to write
 *    u_segflg    write to kernel/user
 */
writei(aip)
struct inode *aip;
/* โ€ฆ */

ื•ื•ื™ ืคึฟืึทืจ "ืงืึธื ืกืขืจื•ื•ืึทื˜ื™ื•ื•ืข" ื‘ืœืึทืงื™ื ื’, ื“ืขืžืึธืœื˜ readp() ะธ writep() ืฉืœืึธืก ื™ื ืึธื“ืขืก ื‘ื™ื– ื–ื™ื™ ืขื ื“ื™ืงืŸ ืึธื“ืขืจ ื‘ืึทืงื•ืžืขืŸ ืึท ืจืขื–ื•ืœื˜ืึทื˜ (ื“"ื” ืจื•ืคืŸ wakeup). plock() ะธ prele() ืึทืจื‘ืขื˜ ืคืฉื•ื˜: ื ื™ืฆืŸ ืึท ืึทื ื“ืขืจืฉ ื’ืึทื ื’ ืคื•ืŸ ืงืึทืœืœืก sleep ะธ wakeup ืœืึธื–ืŸ ืื•ื ื“ื– ื•ื•ืขืงืŸ ืึทืจื•ื™ืฃ ืงื™ื™ืŸ ืคึผืจืึธืฆืขืก ื•ื•ืึธืก ื“ืึทืจืฃ ื“ื™ ืฉืœืึธืก ื•ื•ืึธืก ืžื™ืจ ืคึผื•ื ืงื˜ ื‘ืืคืจื™ื™ื˜:

/*
 * Lock a pipe.
 * If its already locked, set the WANT bit and sleep.
 */
plock(ip)
int *ip;
{
    register *rp;

    rp = ip;
    while(rp->i_flag&ILOCK) {
        rp->i_flag =| IWANT;
        sleep(rp, PPIPE);
    }
    rp->i_flag =| ILOCK;
}

/*
 * Unlock a pipe.
 * If WANT bit is on, wakeup.
 * This routine is also used to unlock inodes in general.
 */
prele(ip)
int *ip;
{
    register *rp;

    rp = ip;
    rp->i_flag =& ~ILOCK;
    if(rp->i_flag&IWANT) {
        rp->i_flag =& ~IWANT;
        wakeup(rp);
    }
}

ืื™ืŸ ืขืจืฉื˜ืขืจ ืื™ืš ืงืขืŸ ื ื™ืฉื˜ ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ืึธืก readp() ื˜ื•ื˜ ื ื™ืฉื˜ ื’ืจื•ื ื˜ prele(ip) ืคืืจืŸ ืจื•ืคืŸ wakeup(ip+1). ื“ืขืจ ืขืจืฉื˜ืขืจ ื–ืึทืš writep() ืจื•ืคื˜ ื–ื™ืš ืืŸ ืื™ืŸ ื–ื™ื™ืŸ ืฉืœื™ื™ืฃ, ื“ืืก plock(ip), ื•ื•ืึธืก ืจืขื–ื•ืœื˜ืื˜ืŸ ืื™ืŸ ืึท ื“ืขื“ืœืึทืง ืื•ื™ื‘ readp() ื”ืื˜ ื ื™ืฉื˜ ืึทื•ื•ืขืงื’ืขื ื•ืžืขืŸ ื–ื™ื™ืŸ ื‘ืœืึธืง ื ืึธืš, ืึทื–ื•ื™ ื“ืขืจ ืงืึธื“ ืžื•ื–ืŸ ืขืคืขืก ืึทืจื‘ืขื˜ ืจื™ื›ื˜ื™ืง. ืื•ื™ื‘ ืื™ืจ ืงื•ืง ื‘ื™ื™ึท wakeup(), ืขืก ื•ื•ืขืจื˜ ืงืœืึธืจ ืึทื– ืขืก ื ืึธืจ ืžืึทืจืงืก ื“ื™ ืกืœื™ืคึผื™ื ื’ ืคึผืจืึธืฆืขืก ื•ื•ื™ ื’ืจื™ื™ื˜ ืคึฟืึทืจ ื“ื•ืจื›ืคื™ืจื•ื ื’, ืึทื–ื•ื™ ืึทื– ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜ sched() ื˜ืึทืงืข ืœืึธื ื˜ืฉื˜ ืขืก. ืึทื–ื•ื™ readp() ื– wakeup(), ืึทื ืœืึทืงืก, ืฉื˜ืขืœื˜ IREAD ืื•ืŸ ืจื•ืคื˜ sleep(ip+2)โ€” ื“ืืก ืืœืฅ ืคืจื™ืขืจ writep() ืจื™ืกื˜ืึทืจื˜ ื“ื™ ืฆื™ืงืœ.

ื“ืึธืก ืงืึทืžืคึผืœื™ืฅ ื“ื™ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ืคึผื™ื™ืคึผืœื™ื™ื ื– ืื™ืŸ ื“ื™ ื–ืขืงืกื˜ ืึทื“ื™ืฉืึทืŸ. ืคึผืฉื•ื˜ ืงืึธื“, ื•ื•ื™ื™ึทื˜-ืจื™ื˜ืฉื™ื ื’ ื™ืžืคึผืœืึทืงื™ื™ืฉืึทื ื–.

ื–ื™ื‘ืขื˜ืขืจ ืึทื“ื™ืฉืึทืŸ ื™ื•ื ื™ืงืก (ื™ืึทื ื•ืึทืจ 1979) ืื™ื– ื’ืขื•ื•ืขืŸ ืึท ื ื™ื™ึทืข ื”ื•ื™ืคึผื˜ ืžืขืœื“ื•ื ื’ (ืคื™ืจ ื™ืืจ ืฉืคึผืขื˜ืขืจ) ื•ื•ืึธืก ื™ื ื˜ืจืึธื•ื“ื•ืกื˜ ืคื™ืœืข ื ื™ื™ึทืข ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืื•ืŸ ืงืขืจืŸ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ. ืขืก ื”ืื˜ ืื•ื™ืš ืึทื ื“ืขืจื’ืึธืŸ ื‘ืึทื˜ื™ื™ึทื˜ื™ืง ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ืงืฉืจ ืžื™ื˜ ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ื˜ื™ืคึผ ืงืึทืกื˜ื™ื ื’, ื™ื•ื ื™ืึทื ื– ืื•ืŸ ื˜ื™ื™ืคึผื˜ ืคึผื•ื™ื ื˜ืขืจื– ืฆื• ืกื˜ืจืึทืงื˜ืฉืขืจื–. ืึธื‘ืขืจ ืคึผื™ื™ืคึผืœื™ื™ื ื– ืงืึธื“ ืคึผืจืึทืงื˜ืึทืงืœื™ ื”ืื˜ ื ื™ืฉื˜ ื˜ื•ื™ืฉืŸ. ืžื™ืจ ืงืขื ืขืŸ ื”ืึธืคึผืงืขืŸ ื“ืขื ืื•ื™ืกื’ืื‘ืข.

Xv6, ืึท ืคึผืฉื•ื˜ ื™ื•ื ื™ืงืก-ื•ื•ื™ ืงืขืจืŸ

ืฆื• ืฉืึทืคึฟืŸ ืึท ืงืขืจืŸ Xv6 ื™ื ืคืœื•ืึทื ืกื˜ ื“ื•ืจืš ื“ื™ ื–ืขืงืกื˜ ืึทื“ื™ืฉืึทืŸ ืคื•ืŸ ื™ื•ื ื™ืงืก, ืึธื‘ืขืจ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ืžืึธื“ืขืจืŸ C ืฆื• ืœื•ื™ืคืŸ ืื•ื™ืฃ ืงืก86 ืคึผืจืึทืกืขืกืขืจื–. ื“ืขืจ ืงืึธื“ ืื™ื– ื’ืจื™ื ื’ ืฆื• ืœื™ื™ืขื ืขืŸ ืื•ืŸ ืคืึทืจืฉื˜ื™ื™ื™ืง. ื ื™ื˜ ืขื ืœืขืš Unix ืงื•ื•ืืœืŸ ืžื™ื˜ TUHS, ืื™ืจ ืงืขื ืขืŸ ืฆื•ื ื•ื™ืคื ืขืžืขืŸ ืขืก, ืžืึธื“ื™ืคื™ืฆื™ืจืŸ ืขืก ืื•ืŸ ืœื•ื™ืคืŸ ืขืก ืื•ื™ืฃ ืขืคึผืขืก ืึทื ื“ืขืจืฉ ื•ื•ื™ PDP 11/70. ื“ืขืจื™ื‘ืขืจ, ื“ืขื ื”ืึทืจืฅ ืื™ื– ื•ื•ื™ื™ื“ืœื™ ื’ืขื ื™ืฆื˜ ืื™ืŸ ืื•ื ื™ื•ื•ืขืจืกื™ื˜ืขื˜ืŸ ื•ื•ื™ ืึท ืœืขืจื ืขืŸ ืžืึทื˜ืขืจื™ืึทืœ ืื•ื™ืฃ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขืžืขืŸ. ืงื•ื•ืขืœืขืจ ื–ืขื ืขืŸ ืื•ื™ืฃ Github.

ื“ืขืจ ืงืึธื“ ื›ึผื•ืœืœ ืึท ืงืœืึธืจ ืื•ืŸ ืคืึทืจื˜ืจืึทื›ื˜ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ pipe.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. ืื™ืš ืจืขืงืึธืžืขื ื“ื™ืจืŸ ืœื™ื™ืขื ืขืŸ ืึทืœืข ื–ื™ื™ืŸ ืงืึธื“. ื“ื™ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™ ืื™ื– ืื•ื™ืฃ ื“ืขืจ ืžื“ืจื’ื” ืคื•ืŸ ื“ื™ ืžืงื•ืจ ืงืึธื“ ืคื•ืŸ ื“ื™ ื–ืขืงืกื˜ ืึทื“ื™ืฉืึทืŸ, ืึธื‘ืขืจ ืขืก ืื™ื– ืคื™ืœ ื’ืจื™ื ื’ืขืจ ืื•ืŸ ืžืขืจ ืึธื ื’ืขื ืขื ืฆื• ืœื™ื™ืขื ืขืŸ.

Linux 0.01

ืื™ืจ ืงืขื ืขืŸ ื’ืขืคึฟื™ื ืขืŸ ื“ื™ ืžืงื•ืจ ืงืึธื“ ืคึฟืึทืจ ืœื™ื ื•ืงืก 0.01. ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื™ื ืกื˜ืจืึทืงื˜ื™ื•ื• ืฆื• ืœืขืจื ืขืŸ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืคึผื™ื™ืคึผืœื™ื™ื ื– ืื™ืŸ ื–ื™ื™ืŸ fs/pipe.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;
}

ืืคื™ืœื• ืึธืŸ ืงื•ืงืŸ ืื™ืŸ ื“ื™ ืกื˜ืจื•ืงื˜ื•ืจ ื“ืขืคึฟื™ื ื™ืฆื™ืข, ืื™ืจ ืงืขื ืขืŸ ืจืขื›ืขื ืขืŸ ืื•ื™ืก ื•ื•ื™ ื“ื™ ื™ื ืึธื“ืข ืจืขืคึฟืขืจืขื ืฅ ืฆื™ื™ืœืŸ ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืื•ื™ื‘ ืึท ืฉืจื™ื™ึทื‘ืŸ ืึธืคึผืขืจืึทืฆื™ืข ืจืขื–ื•ืœื˜ืึทื˜ ืื™ืŸ SIGPIPE. ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื‘ื™ื™ื˜-ื‘ื™ื™-ื‘ื™ื˜ืข ืึทืจื‘ืขื˜, ื“ืขื ืคึฟื•ื ืงืฆื™ืข ืื™ื– ื’ืจื™ื ื’ ืฆื• ืคืึทืจื’ืœื™ื™ึทื›ืŸ ืžื™ื˜ ื“ื™ ืื•ื™ื‘ืŸ ื’ืขื“ืื ืงืขืŸ. ืืคื™ืœื• ืœืึธื’ื™ืง sleep_on/wake_up ื–ืขื˜ ื ื™ืฉื˜ ืื•ื™ืก ืื–ื•ื™ ืคืจืขืžื“.

ืžืึธื“ืขืจืŸ ืœื™ื ื•ืงืก ืงืขืจื ืึทืœื–, FreeBSD, NetBSD, OpenBSD

ืื™ืš ื‘ื™ืŸ ื’ืขืฉื•ื•ื™ื ื“ ืึทืจื™ื‘ืขืจ ืขื˜ืœืขื›ืข ืžืึธื“ืขืจืŸ ืงืขืจืŸ. ืงื™ื™ื ืขืจ ืคื•ืŸ ื–ื™ื™ ื”ืื˜ ืฉื•ื™ืŸ ืึท ื“ื™ืกืง-ื‘ืื–ื™ืจื˜ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ (ื ื™ื˜ ื—ื™ื“ื•ืฉ). ืœื™ื ื•ืงืก ื”ืื˜ ื–ื™ื™ืŸ ืื™ื™ื’ืขื ืข ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ. ืื•ืŸ ื›ืึธื˜ืฉ ื“ื™ ื“ืจื™ื™ ืžืึธื“ืขืจืŸ BSD ืงืขืจื ืึทืœื– ืึทื ื˜ื”ืึทืœื˜ืŸ ื™ืžืคึผืœืึทืžืึทื ืฅ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืงืึธื“ ื•ื•ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ื’ืขืฉืจื™ื‘ืŸ ื“ื•ืจืš John Dyson, ืื™ื‘ืขืจ ื“ื™ ื™ืึธืจืŸ ื–ื™ื™ ื”ืึธื‘ืŸ ื•ื•ืขืจืŸ ืฆื• ืึทื ื“ืขืจืฉ ืคื•ืŸ ื™ืขื“ืขืจ ืื ื“ืขืจืขืจ.

ืฆื• ืœื™ื™ื ืขืŸ fs/pipe.c (ืื•ื™ืฃ ืœื™ื ื•ืงืก) ืึธื“ืขืจ sys/kern/sys_pipe.c (ืื•ื™ืฃ *BSD), ืขืก ื ืขืžื˜ ืคืึทืงื˜ื™ืฉ ื“ืขื“ื™ืงืึทืฆื™ืข. ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื•ืŸ ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ืึทื–ืึท ื•ื•ื™ ื•ื•ืขืงื˜ืึธืจ ืื•ืŸ ื™ื™ืกื™ื ื’ืงืจืึทื ืึทืก ื™ / ืึธ ื–ืขื ืขืŸ ื•ื•ื™ื›ื˜ื™ืง ืื™ืŸ ืงืึธื“ ื”ื™ื™ึทื ื˜. ืื•ืŸ ื“ื™ ื“ืขื˜ืึทื™ืœืก ืคื•ืŸ ื–ื›ึผืจื•ืŸ ืึทืœืึทืงื™ื™ืฉืึทืŸ, ืœืึทืงืก ืื•ืŸ ืงืขืจืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืึทืœืข ื–ืขื ืขืŸ ื–ื™ื™ืขืจ ืึทื ื“ืขืจืฉ. ื“ืึธืก ืื™ื– ื ื™ืฉื˜ ื•ื•ืึธืก ืื•ื ื™ื•ื•ืขืจืกื™ื˜ืขื˜ืŸ ื“ืึทืจืคึฟืŸ ืคึฟืึทืจ ืึทืŸ ื™ื ื˜ืจืึทื“ืึทืงื˜ืขืจื™ ืงื•ืจืก ืื•ื™ืฃ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขืžืขืŸ.

ืื™ืŸ ืงื™ื™ืŸ ืคืึทืœ, ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื˜ืฉื™ืงืึทื•ื•ืข ืคึฟืึทืจ ืžื™ืจ ืฆื• ืึทื ื˜ื“ืขืงืŸ ืขื˜ืœืขื›ืข ืึทืœื˜ ืคึผืึทื˜ืขืจื ื– (ืœืžืฉืœ, ื“ื–ืฉืขื ืขืจื™ื™ื˜ื™ื ื’ SIGPIPE ืื•ืŸ ืฆื•ืจื™ืงืงื•ืžืขืŸ EPIPE ื•ื•ืขืŸ ืžืขืŸ ืฉืจื™ื™ื‘ื˜ ืฆื• ื ืคืืจืžืื›ื˜ืข ืจืขืจื  - ืœื™ื ื™ืข) ืื™ืŸ ื“ื™ ืืœืข, ืื–ื•ื™ ืคืืจืฉื™ื™ื“ืขื ืข, ืžืื“ืขืจื ืข ืงืขืจื ื“ืœืขืš. ืื™ืš ื•ื•ืขืœ ืžื™ืกื˜ืึธืžืข ืงื™ื™ื ืžืึธืœ ื–ืขืŸ ืึท PDP-11 ืงืึธืžืคึผื™ื•ื˜ืขืจ ืœืขื‘ืŸ, ืึธื‘ืขืจ ืขืก ืื™ื– ื ืึธืš ืึท ืคึผืœืึทืฅ ืฆื• ืœืขืจื ืขืŸ ืคื•ืŸ ื“ื™ ืงืึธื“ ื•ื•ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ื’ืขืฉืจื™ื‘ืŸ ืึท ื‘ื™ืกืœ ื™ืึธืจืŸ ืื™ื™ื“ืขืจ ืื™ืš ื‘ื™ืŸ ื’ืขื‘ื•ื™ืจืŸ.

ื’ืขืฉืจื™ื‘ืŸ ื“ื•ืจืš Divi Kapoor ืื™ืŸ 2011, ื“ืขืจ ืึทืจื˜ื™ืงืœ "ื“ื™ ืœื™ื ื•ืงืก ืงืขืจืŸ ื™ืžืคึผืœืขืžืขื ื˜ืึทื˜ื™ืึธืŸ ืคื•ืŸ ืคึผื™ื™ืคึผืก ืื•ืŸ ืคื™ืคืึธืื™ื– ืึทืŸ ืื™ื‘ืขืจื‘ืœื™ืง ืคื•ืŸ ื•ื•ื™ ืœื™ื ื•ืงืก ืคึผื™ื™ืคึผืœื™ื™ื ื– (ืึทื–ื•ื™ ื•ื•ื™ื™ึทื˜) ืึทืจื‘ืขื˜. ื ืœืขืฆื˜ืข ื™ื‘ืขืจื’ืขื‘ืŸ ืื•ื™ืฃ ืœื™ื ื•ืงืก ื™ืœืึทืกื˜ืจื™ื™ืฅ ื“ื™ ืจืขืจื  - ืœื™ื ื™ืข ืžืึธื“ืขืœ ืคื•ืŸ ื™ื ื˜ืขืจืึทืงืฉืึทืŸ, ื•ื•ืขืžืขื ืก ืงื™ื™ืคึผืึทื‘ื™ืœืึทื˜ื™ื– ื™ืงืกื™ื“ ื“ื™ ืคื•ืŸ ืฆื™ื™ึทื˜ื•ื•ื™ื™ึทืœื™ืง ื˜ืขืงืขืก; ืื•ืŸ ืื•ื™ืš ื•ื•ื™ื™ื–ื˜ ื•ื•ื™ ื•ื•ื™ื™ึทื˜ ืคึผื™ื™ืคึผืœื™ื™ื ื– ื”ืึธื‘ืŸ ื ื™ื˜ืึธ ืคื•ืŸ "ื–ื™ื™ืขืจ ืงืึธื ืกืขืจื•ื•ืึทื˜ื™ื•ื•ืข ืœืึทืงื™ื ื’" ืื™ืŸ ื“ื™ ื–ืขืงืกื˜ ืึทื“ื™ืฉืึทืŸ ืคื•ืŸ ื™ื•ื ื™ืงืก ืงืขืจืŸ.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’