ืืขืจ ืึทืจืืืงื ืืืฉืจืืืื ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืคึผืืืคึผืืืื ื ืืื ืื ืืื ืืงืก ืงืขืจื. ืืื ืืื ืืขืืืขื ืขืคึผืขืก ืืืกืึทืคึผืืื ืื ืึทื ืึท ืคืจืืฉ ืึทืจืืืงื ืืืื ืืืื "
ืืืึธืก ืืขื ืขื ืืืจ ืืขืจืขืื ืืืขืื?
ืคึผืืืคึผืืืื ื ืืขื ืขื "ืืืกืืึธืืข ืื ืืขืจืกื ืืืืืืืง ืืขืจืคืื ืืื ื ืืื ืืื ืืงืก" - ืึท ืืืคืืื ืื ื ืฉืืจืื ืคืื ืืื ืืงืก ืก ืึทื ืืขืจืืืืื ื ืคืืืึธืกืึธืคืืข ืคืื โโืฉืืขืื ืฆืืืึทืืขื ืงืืืื ืืืืื, ืืื ืื ืืึทืงืึทื ืืข ืืึทืคึฟืขืื-ืฉืืจื ืงืืื ืืืืึธืจื:
$ echo hello | wc -c
6
ืื ืคืึทื ืืงืฉืึทื ืึทืืืื ืืขืคึผืขื ืืก ืืืืฃ ืื ืงืขืจื-ืฆืืืขืฉืืขืื ืกืืกืืขื ืจืืคื pipe
, ืืืึธืก ืืื ืืืกืงืจืืืื ืืืืฃ ืื ืืึทืงืืืืขื ืืืืฉืึทื ืืืขืืขืจ
ืคึผืืืคึผืืืื ื ืฆืืฉืืขืื ืึท ืืืื-ืืืขื ืงืึทื ืึทื ืคึฟืึทืจ ืื ืืขืจ-ืคึผืจืึธืกืขืก ืงืึธืืื ืืงืึทืฆืืข. ืื ืจืขืจื - ืืื ืืข ืืื ืึทื ืึทืจืืึทื ืฉืจืืึทื (ืฉืจืืึทืื ืกืืฃ) ืืื ืึท ืจืขืืืืืึทื (ืืืืขื ืขื ืกืืฃ). ืืึทืื ืืขืฉืจืืื ืฆื ืื ืึทืจืืึทื ืฉืจืืึทื ืคืื ืื ืจืขืจื - ืืื ืืข ืงืขื ืขื ืืืื ืืืืขื ืขื ืืื ืืขืจ ืจืขืืืืืึทื.
ืื ืจืขืจื - ืืื ืืข ืืื ืืืฉืืคื ืืืจื ืจืืคื
pipe(2)
, ืืืึธืก ืงืขืจื ืฆืืืื ืืขืงืข ืืืกืงืจืืคึผืืึธืจืก: ืืืื ืขืจ ืจืขืคืขืจืก ืฆื ืื ืึทืจืืึทื ืฉืจืืึทื ืคืื ืื ืจืขืจื - ืืื ืืข, ืื ืจืืข ืฆื ืืขืจ ืจืขืืืืืึทื.
ืืขืจ ืฉืคึผืืจ ืจืขืืืืืึทื ืคืื ืื ืืืืื ืืึทืคึฟืขื ืืขืืึทื ืกืืจืืืฅ ืื ืฉืึทืคืื ื ืคืื ืึท ืจืขืจื - ืืื ืืข ืืื ืื ืืืืคื ืคืื ืืึทืื ืืืจื ืขืก ืคืื ืืืื ืคึผืจืึธืฆืขืก ืฆื ืื ืืขืจื:
$ strace -qf -e execve,pipe,dup2,read,write
sh -c 'echo hello | wc -c'
execve("/bin/sh", ["sh", "-c", "echo hello | wc -c"], โฆ)
pipe([3, 4]) = 0
[pid 2604795] dup2(4, 1) = 1
[pid 2604795] write(1, "hellon", 6) = 6
[pid 2604796] dup2(3, 0) = 0
[pid 2604796] execve("/usr/bin/wc", ["wc", "-c"], โฆ)
[pid 2604796] read(0, "hellon", 16384) = 6
[pid 2604796] write(1, "6n", 2) = 2
ืืขืจ ืคืึธืืขืจ ืคึผืจืึธืฆืขืก ืจืืคื pipe()
ืฆื ืืึทืงืืืขื ืึทืืึทืืฉื ืืขืงืข ืืืกืงืจืืคึผืืึธืจืก. ืืืื ืงืื ื ืคึผืจืึธืฆืขืก ืฉืจืืืื ืฆื ืืืื ืืืกืงืจืืคึผืืึธืจ ืืื ืื ืื ืืขืจ ืคึผืจืึธืฆืขืก ืืืืขื ื ืื ืืขืืืข ืืึทืื ืคืื ืื ืื ืืขืจ ืืืกืงืจืืคึผืืึธืจ. ืื ืฉืึธื "ืจืื ืืืื" ืืืกืงืจืืคึผืืึธืจืก 2 ืืื 3 ืืื ืืืคึผ 4 ืฆื ืืืืึทืื ืกืืืื ืืื ืกืืืึธืื.
ืึธื ืคึผืืืคึผืืืื ื, ืื ืฉืึธื ืืืึธืื ืืึธืื ืฆื ืฉืจืืึทืื ืื ืจืขืืืืืึทื ืคืื ืืืื ืคึผืจืึธืฆืขืก ืฆื ืึท ืืขืงืข ืืื ืจืขืจ ืขืก ืฆื ืื ืื ืืขืจ ืคึผืจืึธืฆืขืก ืฆื ืืืืขื ืขื ืื ืืึทืื ืคืื ืืขืจ ืืขืงืข. ืืื ืึท ืจืขืืืืืึทื, ืืืจ ืืืึธืื ืืืืกื ืืขืจ ืจืขืกืืจืกื ืืื ืืืกืง ืคึผืืึทืฅ. ืึธืืขืจ, ืคึผืืืคึผืืืื ื ืืขื ืขื ืืื ืคึฟืึทืจ ืืขืจ ืืื ื ืึธืจ ืืืกืืืืื ืฆืืึทืืืืืึทืืืง ืืขืงืขืก:
ืืืื ืึท ืคึผืจืึธืฆืขืก ืคืจืืืื ืฆื ืืืืขื ืขื ืคึฟืื ืึท ืืืืืืง ืจืขืจื - ืืื ืืข, ืืขืืึธืื
read(2)
ืืืขื ืคืึทืจืฉืคึผืึทืจื ืืื ืื ืืึทืื ืืขื ืขื ืื ืืืฆื. ืืืื ืึท ืคึผืจืึธืฆืขืก ืคืจืืืื ืฆื ืฉืจืืึทืื ืฆื ืึท ืคืื ืจืขืจื - ืืื ืืข, ืืขืืึธืืwrite(2)
ืืืขื ืคืึทืจืฉืคึผืึทืจื ืืื ืืขื ืื ืืึทืื ืืื ืืืืขื ืขื ืคืื ืื ืจืขืจื - ืืื ืืข ืฆื ืคืึทืจืขื ืืืงื ืื ืฉืจืืึทืื.
ืืื ืื POSIX ืคืึธืืขืจืื ื, ืืึธืก ืืื ืึท ืืืืืืืง ืคืึทืจืืึธื: ืฉืจืืืื ืฆื ืื ืจืขืจื - ืืื ืืข ืึทืจืืืฃ ืฆื PIPE_BUF
ืืืืขืก (ืืคึผืืืช 512) ืืืื ืืืื ืึทืืึธืืืฉืข ืึทืืื ืึทื ืคึผืจืึทืกืขืกืึทื ืงืขื ืขื ืืืขืจืืขืื ืืื ืืขืืขืจ ืื ืืขืจืข ืืืจื ืื ืจืขืจื - ืืื ืืข ืืื ืึท ืืืขื ืึทื ื ืึธืจืืึทื ืืขืงืขืก (ืืืึธืก ืืึธื ื ืื ืฆืืฉืืขืื ืึทืืึท ืืขืจืึทื ืืื) ืงืขื ืขื ื ืืฉื.
ืืื ืึท ืจืขืืืืขืจ ืืขืงืข, ืึท ืคึผืจืึธืฆืขืก ืงืขื ืขื ืฉืจืืึทืื ืึทืืข ืคืื โโโโืืืึทื ืจืขืืืืืึทื ืฆื ืขืก ืืื ืคืึธืจื ืขืก ืฆื ืื ืื ืืขืจ ืคึผืจืึธืฆืขืก. ืึธืืขืจ ืคึผืจืึทืกืขืกืึทื ืงืขื ืขื ืึทืจืืขืื ืืื ืึท ืฉืืืขืจ ืคึผืึทืจืึทืืขื ืืึธืืข, ื ืืฆื ืึท ืคืื ืืจืืืกื ืืืง ืกืืื ืึทืืื ื ืืขืงืึทื ืืืึทื (ืืื ืึท ืกืขืืึทืคืึธืจ) ืฆื ืืืืืืืื ืืขืืขืจ ืื ืืขืจืข ืืืขืื ืื ืงืึทืืคึผืืืฉืึทื ืคืื ืฉืจืืืื ืึธืืขืจ ืืืืขื ืขื. ืงืึทื ืืืืืขืจื ืจืึทืืขืืืขื ืืื ืื ืคืื ืึทืืข ืืขื ืืึทืกืึทื.
ืืืึธืก ืืขื ืขื ืืืจ ืงืืงื ืคึฟืึทืจ?
ืืื ืืืขื ืืขืจืงืืขืจื ืืืืฃ ืืืื ืคืื ืืขืจ ืฆื ืืึทืื ืขืก ืืจืื ืืขืจ ืคึฟืึทืจ ืืืจ ืฆื ืืืึทืืืฉืึทื ืืื ืึท ืงืึทื ืืืืืขืจ ืงืขื ืขื ืึทืจืืขืื. ืืืจ ืืืขื ืืึทืจืคึฟื ืฆื ืึทืืึทืงืืื ืึท ืืึทืคืขืจ ืืื ืขืืืขืืข ืฉืืึทื ืืื ืืึผืจืื. ืืืจ ืืืขื ืืึทืจืคึฟื ืคืึทื ืืงืฉืึทื ื ืฆื ืืืืื ืืื ืืึทืืืึทืืืงื ืืึทืื ืคืื ืื ืืึทืคืขืจ. ืืืจ ืืืขื ืืึทืจืคึฟื ืขืืืขืืข ืืขืืืจืขืก ืฆื ืจืืคื ืคืึทื ืืงืฉืึทื ื ืืขืฉืึทืก ืืืืขื ืขื ืืื ืฉืจืืึทืื ืึทืคึผืขืจืืืฉืึทื ื ืืืืฃ ืืขืงืข ืืืกืงืจืืคึผืืึธืจืก. ืืื ืืึทืงืก ืืขื ืขื ืืืจืฃ ืฆื ืื ืกืืจืืืขื ื ืื ืกืคึผืขืฆืืขื ื ืึทืืืจ ืืืกืงืจืืืื ืืืืื.
ืืืจ ืืขื ืขื ืืืฆื ืืจืืื ืฆื ืืืกืคืึธืจืฉื ืื ืืงืืจ ืงืึธื ืคืื ืื ืงืขืจื ืืื ืืขืจ ืืขื ืืึธืืคึผ ืืืื ืฆื ืืึทืฉืืขืืืงื ืึธืืขืจ ืืืกืคึผืจืึธืืืข ืืื ืืืขืจ ืืืืื ืืืึทืกืืืง ืืึธืืขื. ืึธืืขืจ ืฉืืขื ืืืง ืืืื ืฆืืืขืืจืืื ืคึฟืึทืจ ืื ืืืืืขืจืืื.
ืืืื ืืืื ืืืจ?
ืืื ืืืืืก ื ืืฉื ืืืื ืขืก ืืืื ืืืื ืงืืคื ืคืื ืขื ืืืจืืืื ืืื.
ืืืึทื ืืขืจืื ื ืืืจื ืื TUHS ืึทืจืงืืืืื ืืื ืืื ืฆื ืืึทืืืื ืึท ืืืืื. ืืืจ ืงืขื ืขื ืงืืงื ืืื ืืื ืืืขืจ ืฉืขืจื ืืขืฉืืืืข ืืื ืืื ืืึธืื ืจืขืกืคึผืขืงื ืคึฟืึทืจ ืื ืืึธืจื ืคืื ืื ืฆื ืฆืืจืืงืงืจืืื ืึทืืข ืืขื ืืึทืืขืจืืึทื ืืืกื ืืืจื ืืืกื ืคืื ืึทืื ืงืึทืกืขืฅ ืืื ืคึผืจืื ืืึทืื. ืืื ืืื ืืื ืึทืงืืืข ืึทืืืขืจ ืคืื ืื ืคืจืึทืืืึทื ืฅ ืืืึธืก ืืขื ืขื ื ืึธื ืคืขืื ืืืง.
ืืืืื ืฆืืคึฟืจืืื ืืื ืืืขืจ ื ืืึทืืขืจืืงืืึทื ืืืขืื ืื ืืืืข ืืขืฉืืืืข ืคืื โโืคึผืืืคึผืืืื ื, ืืืจ ืงืขื ืขื ืงืืงื ืืื ืืึธืืขืจื ืงืึธืจืขืก ืคึฟืึทืจ ืคืึทืจืืืืึทื.
ืืืจื ืื ืืืขื, pipe
ืืื ืกืืกืืขื ืจืืคื ื ืืืขืจ 42 ืืื ืื ืืืฉ sysent[]
. ืฆืืคืึทื?
ืืจืึทืืืฆืืึธื ืขื ืืื ืืงืก ืงืขืจื ืึทืื (1970-1974)
ืืื ืืึธื ื ืื ืืขืคึฟืื ืขื ืงืืื ืฉืคึผืืจ pipe(2)
ืืืื ื ืืฉื ืืื
TUHS ืงืืืืื ืึทื
ืื ืืจืื ืึทืืืฉืึทื ืคืื ืืื ืืงืก ืืื ืืขืืืขื ืื ืืขืฆืืข ืืืขืจืกืืข ืืื ืึท ืงืขืจื ืืขืฉืจืืื ืืื ืึทืกืขืืืึทืืืขืจ, ืึธืืขืจ ืืืื ืืขืจ ืขืจืฉืืขืจ ืืืขืจืกืืข ืืื ืคึผืืืคึผืืืื ื. ืืขืฉืึทืก 1973, ืึทืจืืขื ืืื ืืขืืืขื ืึทื ืืขืจืืืื ืฆื ืคึฟืึทืจืืขืกืขืจื ืื ืืจืื ืึทืืืฉืึทื, ืืขืจ ืงืขืจื ืืื ืืขืืืขื ืจืืจืืื ืืื C, ืืื ืึทืืื ืื ืคืขืจื ืึทืืืฉืึทื ืคืื ืืื ืืงืก ืืื ืืขืืืืจื.
ืืืื ืืืืขื ืขืจ ืืขืคืื ืขื ืึท ืืืขืจืงืืงื ืคืื ืึท ืืึธืงืืืขื ื ืืื ืืืึธืก ืืึทื ืืึทืงืืืจืื ืคืืจืืขืืืืื ืืขื ืืขืืึทื ืง ืคืื "ืคืึทืจืืื ืื ืืืืื ืืื ืึท ืืึธืจืื ืงืืฉืงืข."
ืืื Brian Kernighan ืก ืืื
ืืืขื ืืื ืืงืก ืืจืืืก, ืืืื ืืืึทืื ืฉืึทืคื ืคึฟืึทืจ ืงืึธืจืึธืืืื ืขืก ืืึธื ืืืจ ืืขืืขืื ืืขื ืึทืก ืืืืจ, Ken Thompson, ืฆื ืืึธืื ืืึทืื ืืขืฉืจืืื ืฆื ืขืืืขืืข ืคึผืจืึธืฆืขืก ืฆื ืืืื ื ืืฉื ืืืืื ืฆื ืื ืืืื, ืึธืืขืจ ืืืื ืฆื ืื ืึทืจืืืกืืึทื ื ืฆื ืื ืื ืืขืจ ืคึผืจืึธืฆืขืก. ืงืขื ืืึทืฉืืึธืกื ืึทื ืขืก ืืื ืืขืืืขื. ืึธืืขืจ, ืืื ืึท ืืื ืืืึทืืืกื, ืขืจ ืืขืืืืื ืึทื ืืขืืขืจ ืกืืกืืขื ืฉืืจืื ืืึธื ืฉืคึผืืื ืึท ืืึทืืืืืืง ืจืึธืืข. ืืื ืืืจืขืงื ืฉืจืืืื ืฆืืืืฉื ืคึผืจืึทืกืขืกืึทื ืืึทืงืข ืึท ืืจืืืก ืืืึทืืข ืืืืขืจ ืฉืจืืืื ืฆื ืึท ืื ืืขืจืืืืืื ืืขืงืข? ืืื ืืืืื ืืืขื ืืื ืืขืืืื ืึท ืกืคึผืขืฆืืคืืฉ ืคืึธืจืฉืืึธื ืืื ืื ืงืึทืืฉื ื ืึธืืขื "ืจืขืจื - ืืื ืืข" ืืื ืึท ืืึทืฉืจืืึทืืื ื ืคืื ืื ืกืื ืืึทืงืก ืคืื ืื ืื ืืขืจืึทืงืฉืึทื ืคืื ืคึผืจืึทืกืขืกืึทื, ืงืขื ืืขืกืึธืฃ ืืงืกืงืืืืื: "ืืื ืืืขื ืืึธื ืขืก!".
ืืื ืืื. ืืืื ืืืืจืืืืง ืึธืืื ื, Ken ืืฉืืื ืืืฉื ืื ืงืขืจื ืืื ืฉืึธื, ืคืึทืจืคืขืกืืืงื ืขืืืขืืข ื ืึธืจืืึทื ืืืืื ืฆื ืกืืึทื ืืขืจืืืื ืืื ืืื ืึธื ื ืขืืขื ืึทืจืืึทื ืฉืจืืึทื (ืืืึธืก ืงืขื ืงืืืขื ืคืื ืึท ืจืขืจื - ืืื ืืข), ืืื ืืฉืืื ืืืฉื ืคืืืขื ืึทืืขืก. ืืขืจ ืืืืึทืืขืจ ืืึธื, ืคึผืืืคึผืืืื ื ืืขื ืขื ืืืืขืจ ืืืืืืื ืืขื ืืฆื ืืื ืึทืคึผืืึทืงืืืฉืึทื ื. ืกืืฃ ืืืื ืืืื ืื ืกืขืงืจืขืืืจื ืืื ืืขื ืืฆื ืฆื ืฉืืงื ืืืงืืืขื ืื ืคืื ืืืืจื ืคืจืืกืขืกืืจื ืฆืื ืืจืืงืขืจ. ืขืคึผืขืก ืฉืคึผืขืืขืจ, Ken ืจืืคึผืืืืกื ืืขืจ ืึธืจืืืื ืขื ืึทืคึผื ืืื ืกืื ืืึทืงืก ืคึฟืึทืจ ืจืึทืคึผืื ื ืื ื ืืฆื ืคืื ืคึผืืืคึผืืืื ื ืืื ืงืืื ืขืจ ืงืึทื ืืืขื ืฉืึทื ื ืืืึธืก ืืึธืื ืฉืืื ืืขืืืืื ื ืืื ื.
ืฆืื ืืึทืืืืขืจื, ืืขืจ ืืงืืจ ืงืึธื ืคึฟืึทืจ ืื ืืจืื ืึทืืืฉืึทื ืคืื ืืื ืืงืก ืงืขืจื ืืื ืคืึทืจืคืึทืื. ืืื ืืึธืืฉ ืืืจ ืืึธืื ืื ืงืขืจื ืืงืืจ ืงืึธื ืืขืฉืจืืื ืืื C
ืืืจ ืืึธืื ืืึทืงืืืืขื ืืืืฉืึทื ืืขืงืกื ืคึฟืึทืจ pipe(2)
ืคึฟืื ืืืืืข ืจืืืืกืื, ืึทืืื ืืืจ ืงืขื ืขื ืึธื ืืืืื ืืืจื ืืืื ืื ืืึทืงืืืืขื ืืืืฉืึทื pipe(2)
ืืื ืืขืฉืจืืื ืืื ืึทืกืขืืืึทืืืขืจ ืืื ืงืขืจื ืืืืื ืืืื ืืขืงืข ืืืกืงืจืืคึผืืึธืจ, ืึธืืขืจ ืฉืืื ืืื ืื ืืขืจืืืึทืจื ืืึทืจืฅ ืคืึทื ืืงืฉืึทื ืึทืืืื:
ืกืืกืืขื ืจืืคื ืจืขืจ ืงืจืืืืฅ ืึทื I/O ืืขืงืึทื ืืืึทื ืืขืจืืคื ืึท ืจืขืจื - ืืื ืืข. ืืขืจ ืืืืืขืงืขืจื ืืขืงืข ืืืกืงืจืืคึผืืึธืจ ืงืขื ืขื ืืืขืจื ืืขื ืืฆื ืคึฟืึทืจ ืืืืขื ืขื ืืื ืฉืจืืึทืื ืึทืคึผืขืจืืืฉืึทื ื. ืืืขื ืขืคึผืขืก ืืื ืืขืฉืจืืื ืฆื ืื ืจืขืจื - ืืื ืืข, ืขืก ืืึทืคืขืจื ืึทืจืืืฃ ืฆื 504 ืืืืขืก ืคืื ืืึทืื, ื ืึธื ืืืึธืก ืื ืฉืจืืืื ืคึผืจืึธืฆืขืก ืืื ืกืืกืคึผืขื ืืขื. ืืืขื ืืืืขื ืขื ืคืื ืื ืจืขืจื - ืืื ืืข, ืื ืืึทืคืขืจื ืืึทืื ืืื ืืขื ืืืขื.
ืืื ืื ืคืืืืขื ืืข ืืึธืจ, ืื ืงืขืจื ืืื ืืขืืืขื ืจืืฉืจืืื ืืื C, ืืื pipe(fildes)
'
ืกืืกืืขื ืจืืคื ืจืขืจ ืงืจืืืืฅ ืึทื I/O ืืขืงืึทื ืืืึทื ืืขืจืืคื ืึท ืจืขืจื - ืืื ืืข. ืื ืืืืืขืงืขืจื ืืขืงืข ืืืกืงืจืืคึผืืึธืจืก ืงืขื ืขื ืืืื ืืขืืืืื ื ืืื ืืืืขื ืขื ืืื ืฉืจืืึทืื ืึทืคึผืขืจืืืฉืึทื ื. ืืืขื ืขืคึผืขืก ืืื ืืขืฉืจืืื ืฆื ืื ืจืขืจื - ืืื ืืข, ืืขืจ ืืืกืงืจืืคึผืืึธืจ ืืืืืขืงืขืจื ืืื r1 (ืจืขืกืคึผ. ืคืืืืขืก [1]) ืืื ืืขื ืืฆื, ืืึทืคืขืจื ืึทืจืืืฃ ืฆื 4096 ืืืืขืก ืคืื ืืึทืื, ื ืึธื ืืืึธืก ืื ืฉืจืืึทืื ืคึผืจืึธืฆืขืก ืืื ืกืืกืคึผืขื ืืขื. ืืืขื ืืืืขื ืขื ืคืื ืื ืจืขืจื - ืืื ืืข, ืื ืืืกืงืจืืคึผืืึธืจ ืืืืืขืงืขืจื ืฆื ืจ0 (ืจืขืกืคึผ. ืคืืืืขืก [0]) ื ืขืื ืื ืืึทืื.
ืขืก ืืื ืื ืืขื ืืืขื ืึทื ืึทืืึธื ืึท ืจืขืจื - ืืื ืืข ืืื ืืืคืืื ื, ืฆืืืื (ืึธืืขืจ ืืขืจ) ืื ืืขืจืึทืงืืื ื ืคึผืจืึทืกืขืกืึทื (ืืืฉืืคื ืืืจื ืกืึทืืกืึทืงืืืึทื ื ืื ืืืึทืงืืืฉืึทื ื ืืึธืคึผื) ืืืขื ืคืึธืจื ืืึทืื ืคืื ืื ืจืขืจื - ืืื ืืข ื ืืฆื ืงืึทืืืก ืืืืขื ืขื ะธ ืฉืจืืึทืื.
ืื ืฉืึธื ืืื ืึท ืกืื ืืึทืงืก ืคึฟืึทืจ ืืืคืืื ืื ื ืึท ืืื ืขืึทืจ ืืขื ืืข ืคืื โโืคึผืจืึทืกืขืกืึทื ืคืืจืืื ืื ืืืจื ืึท ืจืขืจื - ืืื ืืข.
ืจืืคื ืฆื ืืืืขื ืขื ืคืื ืึท ืืืืืืง ืจืขืจื - ืืื ืืข (ืืื ืงืืื ืืึทืคืขืจื ืืึทืื) ืืืึธืก ืืื ืืืืื ืืืื ืกืืฃ (ืึทืืข ืฉืจืืึทืื ืืขืงืข ืืืกืงืจืืคึผืืึธืจืก ืคึฟืึทืจืืึทืื) ืฆืืจืืงืงืืืขื "ืกืืฃ ืคืื ืืขืงืข". ืฉืจืืื ืจืืคื ืืื ืึท ืขื ืืขื ืกืืืืึทืฆืืข ืืขื ืขื ืืืื ืึธืจืืจื.
ืขืจืืืึทืกื
ืืื ืืงืก ืืขืงืกื ืึทืืืฉืึทื (1975)
ืกืืึทืจืืื ื ืฆื ืืืืขื ืขื Unix ืืงืืจ ืงืึธื
ืคึฟืึทืจ ืคืืืข ืืึธืจื ืื ืืื ืืืึธื ืก ืืื ืืขืืืขื ืืขืจ ืืืืื ืืึธืงืืืขื ื ืืืืฃ ืื ืืื ืืงืก ืงืขืจื ืื ืืืฆื ืึทืจืืืก ืคืื ืืขื ืืึทืืก. ืืึธืืฉ ืื ืืขืงืกื ืึทืืืฉืึทื ืืขืจืืืืืขื ืืฉ ืืขืจืืืืื ืืขืจืขืจืก ืฆื ื ืืฆื ืืืึทื ืืงืืจ ืงืึธื, ืื ืืืืขื ืึทืืืฉืึทื ืืขืจืืืืืขื ืืฉ ืืงืกืงืืืืื ืื ืืขืืืขืืงืืื, ืึทืืื ืืขืจ ืืื ืืื ืคืื ืื ืืขืจืืขืืืืื ืืื ืืืืขืืึทื ืืืืคึผ-ืืขืฉืจืืื ืงืึธืคึผืืขืก.
ืืืื ื ืงืขื ืืขื ืงืืืคื ื ืืืืขืจืืจืืงื ืคืื ืืขื ืืื, ืืืืฃ ืืืืก ืื ืืขืงื ืฉืืืืขืจื ืื ืกืืืืขื ืื ืืื ืื ืงืืคืืขืจ. ืืื ืืึทื ืง ืฆื Warren Toomey (ืืืึธืก ืกืืึทืจืืขื ืื TUHS ืคึผืจืืืขืงื), ืืืจ ืงืขื ืขื ืืจืืคืงืืคืืข
ืืื 15 ืืึธืจ ืฆืืจืืง, ืืื ืืืืคึผื ืึท ืงืึธืคึผืืข ืคืื โโโโืื ืืงืืจ ืงืึธื ืฆืืืขืฉืืขืื ืืื ืืืึธื ืกืืืืึทื ืืื ืืื ื ืื ืืื ืื ืงืืืึทืืืืขื ืคืื ืืืื ืงืึธืคึผืืข ืคืื โโืึทื ืืืืืึทืงืึทื ื ื ืืืขืจ ืคืื ืื ืืขืจืข ืงืึธืคึผืืขืก. TUHS ืืื ื ืืฉื ืขืงืกืืกืืืจื ื ืึธื, ืืื ืืื ืืื ื ืืฉื ืืึธืื ืฆืืืจืื ืฆื ืื ืึทืื ืืงืืจืื. ืึธืืขืจ ืืื 1988 ืืื ืืขืคึฟืื ืขื ืึทื ืึทืื ืืึทืฉืืข ืืื 9 ืืจืึทืงืก ืืืึธืก ืืื ืึท ืืึทืงืึทืคึผ ืคืื ืึท PDP11 ืงืึธืืคึผืืืืขืจ. ืขืก ืืื ืืขืืืขื ืฉืืืขืจ ืฆื ืืืืกื ืืืื ืขืก ืืขืืจืืขื, ืึธืืขืจ ืขืก ืืื ืืขืืืขื ืึทื ืืขืฉืึธืืขื /usr/src/ ืืืื ืืื ืืืึธืก ืจืืึฟ ืคืื ืื ืืขืงืขืก ืืขื ืขื ืื ืืขืฆืืืื ื 1979, ืืืึธืก ืึทืคึฟืืื ืืขืืึธืื ืืขืงืืงื ืืืืข. ืขืก ืืื ืืขืืืขื ืืขืจ ืืืืขืืขืจ ืึทืืืฉืึทื, ืึธืืขืจ ืึท ืคึผืืื ืืขืจืืืืึทื, ืืื ืืขืืึทื ืง.
ืืื ืืึธื ืืขื ืืืขื ืืขื ืืขืคึฟืื ืขื ืืื ืึท ืืงืขืจ ืืื ืืึทื ืืืึทืื ืขืืืืื ืื ืืงืืจืื ืฆื ืื ืฉืืึทื ืคืื ืื ืืขืงืกื ืึทืืืฉืึทื. ืืืื ืคืื ืื ืงืึธื ืคืืจืืืืื ืื ืืขืืืข, ืืืื ืืื ืฆื ืืืื ืึท ืืืกื ืขืืืืื, ืืฉืึทื ืืื ื ืื ืืึธืืขืจื ืกืืืขื += ืฆื ืื ืคืึทืจืขืืืขืจื =+. ืขืคึผืขืก ืืื ืคึผืฉืื ืืืืกืืขืืขืงื ืืขืืืึธืจื, ืืื ืขืคึผืขืก ืืึธื ืืขื ืืขืืืื ืืึธืจ ืืืืขืจืฉืจืฒึทืื, ืึธืืขืจ ื ืืฉื ืฆื ืคืื.
ืืื ืืืึทื ื ืืืจ ืงืขื ืขื ืืืืขื ืขื ืึธื ืืืื ืืื TUHS ืื ืืงืืจ ืงืึธื ืคืื ืื ืืขืงืกื ืึทืืืฉืึทื ืคืื
ืืืจื ืืขื ืืืขื, ืืื ืขืจืฉืืขืจ ืืืืง, ืื ืืืืคึผื ืฉืืจืื ืคืื ืื C-ืงืึธื ืืืืืขืจ ืื ืฆืืึทื ืคืื Kernighan ืืื Ritchie ืืื ืืืื ืงืืจืฅืงืืื. ืขืก ืืื ื ืืฉื ืึธืคื ืึทื ืืื ืงืขื ืึทืจืืึทื ืืืืื ืกื ืืคึผืคึผืขืฅ ืคืื ืงืึธื ืึธื ืืจืืื ืขืืืืื ื ืฆื ืคึผืึทืกืืง ืึท ืืขืคืืขืจืขื ืฉืืึธื ืึทืจืืืกืืืืึทืื ืืขืื ื ืืืืฃ ืืืื ืคึผืืึทืฅ.
ืคืจื
/*
* 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 ืืขืงืขืก, ืืื ืฉืืืืขื ืฆื
ืืึธ ืืื ืื ืคืึทืงืืืฉ ืกืืกืืขื ืจืืคื 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
ืกืืกืืขื ืจืืคื ืคึผืึทืจืึทืืขืืขืจืก ืืื ืฆืืจืืงืงืืืขื ืืืึทืืืขืก ืืขื ืขื ืืืจืืืขืืื ืืขื.
ืืื ืก ืคึผืจืืืืจื ืืื
pipe()
ืจืขืื ืืืจื R0
ะธ R1
ืฆืืจืืงืงืืืขื ืืขืงืข ืืืกืงืจืืคึผืืึธืจ ื ืืืขืจื ืคึฟืึทืจ ืืืืขื ืขื ืืื ืฉืจืืืื. falloc()
ืงืขืจื ืึท ืืืึทืื ืฆื ืึท ืืขืงืข ืกืืจืืงืืืจ, ืึธืืขืจ ืืืื "ืงืขืจื" ืืืจื u.u_ar0[R0]
ืืื ืึท ืืขืงืข ืืืกืงืจืืคึผืืึธืจ. ืึทื ืืื, ืื ืงืึธื ืืื ืกืืึธืจื ืืื r
ืืขืงืข ืืืกืงืจืืคึผืืึธืจ ืคึฟืึทืจ ืืืืขื ืขื ืืื ืึทืกืืื ื ืึท ืืืกืงืจืืคึผืืึธืจ ืคึฟืึทืจ ืฉืจืืืื ืืืืึทื ืคึฟืื u.u_ar0[R0]
ื ืึธื ืฆืืืืืื ืจืืคื falloc()
.
Flag FPIPE
, ืืืึธืก ืืืจ ืฉืืขืื ืืืขื ืงืจืืืืืื ื ืื ืจืขืจื - ืืื ืืข, ืงืึธื ืืจืึธืืก ืื ื ืึทืืืจ ืคืื ืื ืคึฟืื ืงืฆืืข
/*
* 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()
ืจืืกืืึทืจื ืื ืฆืืงื.
ืืึธืก ืงืึทืืคึผืืืฅ ืื ืืึทืฉืจืืึทืืื ื ืคืื ืคึผืืืคึผืืืื ื ืืื ืื ืืขืงืกื ืึทืืืฉืึทื. ืคึผืฉืื ืงืึธื, ืืืืึทื-ืจืืืฉืื ื ืืืคึผืืึทืงืืืฉืึทื ื.
Xv6, ืึท ืคึผืฉืื ืืื ืืงืก-ืืื ืงืขืจื
ืฆื ืฉืึทืคึฟื ืึท ืงืขืจื
ืืขืจ ืงืึธื ืึผืืื ืึท ืงืืึธืจ ืืื ืคืึทืจืืจืึทืื ืืืคึผืืึทืืขื ืืืืฉืึทื 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
ืืื ืึท ืจืึทืคึผืขืจ ืืืคึผืืึทืืขื ืึทื ืืื
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