เบเบปเบเบเบงเบฒเบกเบเบตเปเบญเบฐเบเบดเบเบฒเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบญเบเบเปเปเปเบ Unix kernel. เบเปเบฒโเบเบฐโเปเบเบปเปเบฒโเบเบดเบโเบซเบงเบฑเบโเบเบฒเบโเบขเปเบฒเบโเบเบตเปโเบเบปเบโเบเบงเบฒเบกโเบเบตเปโเบเปเบฒเบโเบกเบฒโเบเบตเปโเบกเบตโเบซเบปเบงโเบเปเปโเบงเปเบฒ ".
เบเบงเบเปเบฎเบปเบฒเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบซเบเบฑเบ?
เบเปเปเปเบกเปเบ "เบญเบฒเบเบเบฐเปเบเบฑเบเบชเบดเปเบเบเบฐเบเบดเบเบเบตเปเบชเปเบฒเบเบฑเบเบเบตเปเบชเบธเบเปเบ Unix" - เบฅเบฑเบเบชเบฐเบเบฐเบเบตเปเบเปเบฒเบเบปเบเบเบญเบเบเบฑเบเบเบฐเบเบฒเบเบทเปเบเบเบฒเบเบเบญเบ Unix เปเบเบเบฒเบเบงเบฒเบเปเบเบเบเบฒเบเบเบฐเบซเบเบฒเบเบเปเบญเบเบฎเปเบงเบกเบเบฑเบ, เปเบฅเบฐเบเปเบฒเบเบงเบฑเบเบเบญเบเปเบชเบฑเปเบเบเปเบฒเบชเบฑเปเบเบเบตเปเบเบธเปเบเปเบเบตเบ:
$ echo hello | wc -c
6
เบเบฑเบเบเบฑเบเบเบตเปเบเบถเปเบเบเบฑเบเบเบฒเบเปเบญเบตเปเบเบฅเบฐเบเบปเบเบเบตเปเปเบซเป kernel 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 เบเปเบงเบ dup4 เปเบเบทเปเบญเปเบซเปเบเบปเบเบเบฑเบ stdin เปเบฅเบฐ stdout.
เปเบเบเบเปเปเบกเบตเบเปเป, เปเบเบฐเบเบฐเบเปเบญเบเบเบฝเบเบเบปเบเบเบฐเบฅเบดเบเบเบญเบเบเบฐเบเบงเบเบเบฒเบเบซเบเบถเปเบเปเบเบซเบฒเปเบเบฅเปเปเบฅเบฐเบเปเปเบกเบฑเบเปเบเบซเบฒเบเบฐเบเบงเบเบเบฒเบเบญเบทเปเบเปเบเบทเปเบญเบญเปเบฒเบเบเปเปเบกเบนเบเบเบฒเบเปเบเบฅเป. เบเบฑเปเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบชเบเบเบฑเบเบเบฐเบเบฒเบเบญเบ เปเบฅเบฐเบเบทเปเบเบเบตเปเบเบดเบชเบเปเบซเบผเบฒเบเบเบถเปเบ. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเปเปเปเบกเปเบเบเบตเบชเปเบฒเบฅเบฑเบเบซเบผเบฒเบเบเปเบงเบฒเบเบฝเบเปเบเปเบซเบผเบตเบเปเบงเบฑเปเบเบเบฒเบเปเบเบฅเปเบเบปเปเบงเบเบฒเบง:
เบเปเบฒเบเบฐเบเบงเบเบเบฒเบเบเบฐเบเบฒเบเบฒเบกเบญเปเบฒเบเบเบฒเบเบเปเปเปเบเบปเปเบฒ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ
read(2)
เบเบฐเบเบฅเบฑเบญเบเบเบปเบเบเบงเปเบฒเบเปเปเบกเบนเบเบเบฐเบชเบฒเบกเบฒเบเปเบเปเปเบเป. เบเปเบฒเบเบฐเบเบงเบเบเบฒเบเบเบฐเบเบฒเบเบฒเบกเบเบฝเบเปเบชเปเบเปเปเปเบเบฑเบก, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบwrite(2)
เบเบฐเบเบดเบเบเบฑเปเบเบเบปเบเบเปเบงเบฒเบเปเปเบกเบนเบเบเบฝเบเบเปเปเบเปเบเบทเบเบญเปเบฒเบเบเบฒเบเบเปเปเปเบเบทเปเบญเปเบฎเบฑเบเบชเปเบฒเปเบฅเบฑเบเบเบฒเบเบเบฝเบ.
เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเปเปเบเปเบฒเบเบปเบ POSIX, เบเบตเปเปเบกเปเบเบเบฑเบเบชเบดเบเบเบตเปเบชเปเบฒเบเบฑเบ: เบเบฒเบเบเบฝเบเปเบเบซเบฒเบเปเปเปเบเบดเบ PIPE_BUF
bytes (เบขเปเบฒเบเบซเบเปเบญเบ 512) เบเบฐเบเปเบญเบเปเบเบฑเบเบเบฐเบฅเปเบฒเบกเบฐเบเบนเปเบเบทเปเบญเปเบซเปเบเบฐเบเบงเบเบเบฒเบเบชเบฒเบกเบฒเบเบชเบทเปเบชเบฒเบเบเบฑเบเบเบฑเบเปเบฅเบฐเบเบฑเบเปเบเบเบเปเบฒเบเบเปเปเปเบเบงเบดเบเบตเบเบฒเบเบเบตเปเปเบเบฅเปเบเบปเบเบเบฐเบเบด (เบเบตเปเบเปเปเปเบเปเบชเบฐเบซเบเบญเบเบเบฒเบเบฎเบฑเบเบเบฐเบเบฑเบเบเบฑเปเบเบเปเบฒเบง) เบเปเปเบชเบฒเบกเบฒเบ.
เบเปเบงเบเปเบเบฅเปเบเบปเบเบเบฐเบเบด, เบเบฐเบเบงเบเบเบฒเบเบชเบฒเบกเบฒเบเบเบฝเบเบเบปเบเบเบฐเบฅเบดเบเบเบญเบเบกเบฑเบเบเบฑเบเบซเบกเบปเบเปเบซเปเบเบฑเบเบกเบฑเบเปเบฅเบฐเบชเบปเปเบเบเปเปเบเบฐเบเบงเบเบเบฒเบเบญเบทเปเบ. เบซเบผเบทเบเบฐเบเบงเบเบเบฒเบเบเปเบฒเบเปเบชเบฒเบกเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเปเบเบฎเบนเบเปเบเบเบเบฐเบซเบเบฒเบเบเบฒเบ, เปเบเบเปเบเปเบเบปเบเปเบเบเบฒเบเบชเบปเปเบเบชเบฑเบเบเบฒเบเบเบฒเบเบเบญเบ (เปเบเบฑเปเบ Semalt) เปเบเบทเปเบญเปเบเปเบเปเบซเปเบเบฑเบเปเบฅเบฐเบเบฑเบเบเปเบฝเบงเบเบฑเบเบเบฒเบเบชเปเบฒเปเบฅเบฑเบเบเบฒเบเบเบฝเบเบซเบผเบทเบญเปเบฒเบ. conveyors เบเปเบงเบเบเบฐเบขเบฑเบเบเบงเบเปเบฎเบปเบฒเบเบฒเบเบเบงเบฒเบกเบซเบเบธเปเบเบเบฒเบเบเบฑเบเบซเบกเบปเบเบเบตเป.
เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเบเบญเบเบซเบฒเบซเบเบฑเบ?
เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบญเบฐเบเบดเบเบฒเบเบเปเบฝเบงเบเบฑเบเบเบดเปเบงเบกเบทเบเบญเบเบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเบทเปเบญเปเบฎเบฑเบเปเบซเปเบกเบฑเบเบเปเบฒเบเบเบถเปเบเบชเปเบฒเบฅเบฑเบเบเปเบฒเบเบเบตเปเบเบฐเบเบดเบเบเบฐเบเบฒเบเบฒเบเบงเบดเบเบตเบเบฒเบเบฅเปเบฒเบฅเบฝเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบเบงเบฝเบเปเบเป. เบเปเบฒเบเบเบฐเบเปเบญเบเบเบฑเบเบชเบฑเบ buffer เปเบฅเบฐเบเบฒเบเบฅเบฑเบเปเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒ. เบเปเบฒเบเบเบฐเบเปเบญเบเบเบฒเบเบเบฑเบเบเบฑเบเปเบเบทเปเบญเปเบเบตเปเบก เปเบฅเบฐเบฅเบถเบเบเปเปเบกเบนเบเบญเบญเบเบเบฒเบเบเบฑเบเปเบเบต. เบเปเบฒเบเบเบฐเบเปเบญเบเบเบฒเบเบชเบดเปเบเบญเปเบฒเบเบงเบเบเบงเบฒเบกเบชเบฐเบเบงเบเบเบฒเบเบขเปเบฒเบเปเบเบทเปเบญเปเบญเบตเปเบเบเบฑเบเบเบฑเบเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบญเปเบฒเบ เปเบฅเบฐเบเบฝเบเปเบเบเบปเบงเบญเบฐเบเบดเบเบฒเบเปเบเบฅเป. เปเบฅเบฐ locks เปเบกเปเบเบเปเบฒเปเบเบฑเบเปเบเบทเปเบญเบเบฐเบเบดเบเบฑเบเบเบถเบเบเบดเบเปเบฒเบเบดเปเบชเบเบเบตเปเปเบเปเบญเบฐเบเบดเบเบฒเบเบเปเบฒเบเปเบเบดเบ.
เบเบฝเบงเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบกเบเบตเปเบเบฐเบชเบญเบเบเบฒเบกเบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบเบญเบเปเบเปเบเบเบฒเบเปเบเปเปเบเบกเปเบเบเบตเปเบชเบปเบเปเบชเปเบเบทเปเบญเบขเบทเบเบขเบฑเบเบซเบผเบทเบเบฐเบเบดเปเบชเบเบเบปเบงเปเบเบเบเบฒเบเบเบดเบเบเบตเปเบเปเปเบเบฐเปเบเปเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ. เปเบเปเบชเบฐเปเบซเบกเบตเบเบฝเบกเบเปเบญเบกเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเปเบเบฒเบเบเบดเบ.
เบเบงเบเปเบฎเบปเบฒเบเบญเบเบซเบฒเบขเบนเปเปเบช?
เบเปเบญเบเบเปเปเบฎเบนเปเบงเปเบฒเบชเบณเปเบเบปเบฒเบเบถเปเบกเบเบตเปเบกเบตเบเบทเปเบชเบฝเบเบเบญเบเบเปเบญเบเบขเบนเปเปเบช.
เบเบฒเบเบเปเบฒเบเบเปเบฒเบเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบ TUHS เปเบกเปเบเบเปเบฒเบเบเบทเบเบฑเบเบเบฒเบเปเบเบขเปเบฝเบกเบขเบฒเบกเบเบดเบเบดเบเบฐเบเบฑเบ. เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบเบดเปเบเบเบฐเบซเบงเบฑเบเบชเบฒเบเบฎเปเบงเบกเบเบฑเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเปเบฅเบฐเบเปเบฒเบเบฐเปเบเบปเปเบฒเบกเบตเบเบงเบฒเบกเปเบเบปเบฒเบฅเบปเบเบชเปเบฒเบฅเบฑเบเบเบงเบฒเบกเบเบฐเบเบฒเบเบฒเบกเบซเบผเบฒเบเบเบตเบเบตเปเบเบฐเบเบทเปเบเบเบปเบงเปเบญเบเบฐเบชเบฒเบเบเบฑเบเบซเบกเบปเบเบเบตเปเปเบเบทเปเบญเบฅเบฐเบซเบเปเบญเบเบเบฒเบ cassettes เปเบเบปเปเบฒเปเบฅเบฐเบเบดเบกเบญเบญเบ. เปเบฅเบฐเบเปเบฒเบเบฐเปเบเบปเปเบฒเบฎเบนเปเบขเปเบฒเบเบเบฐเปเบเปเบเบเปเบฝเบงเบเบฑเบเบเบดเปเบเบชเปเบงเบเบเบตเปเบเบฑเบเบเบฒเบเบซเบฒเบเปเบ.
เปเบเบเบเปเปเบเบเบฑเบเบเบงเบฒเบกเบขเบฒเบเบฎเบนเปเบขเบฒเบเปเบซเบฑเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเปเบฝเบงเบเบฑเบเบเบฐเบซเบงเบฑเบเบชเบฒเบเบเบนเบฎเบฒเบเบเบญเบเบเปเป, เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบเบดเปเบเปเบเบเบเบตเปเบเบฑเบเบชเบฐเปเบซเบกเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฝเบเบเบฝเบ.
เปเบเบเบงเบดเบเบตเบเบฒเบเบเบฒเบ, pipe
เปเบกเปเบเบฅเบฐเบเบปเบเบเบฒเบเปเบเปเบฅเบ 42 เปเบเบเบฒเบเบฐเบฅเบฒเบ sysent[]
. เบเบฑเบเปเบญเบตเบ?
เปเบเปเบ Unix เปเบเบเบเบฑเปเบเปเบเบตเบก (1970-1974)
เบเปเบญเบเบเปเปเบเบปเบเบฎเปเบญเบเบฎเบญเบเปเบเป pipe(2)
เบเปเปเบขเบนเปเปเบ
TUHS เบญเปเบฒเบเบงเปเบฒ
เบชเบฐเบเบฑเบเบเบตเบชเบฒเบกเบเบญเบ Unix เปเบกเปเบเบชเบฐเบเบฑเบเบชเบธเบเบเปเบฒเบเบเบตเปเบกเบต kernel เบเบฝเบเปเบเบเบปเบงเบเบฐเบเบญเบ, เปเบเปเบเบฑเบเปเบเบฑเบเบชเบฐเบเบฑเบเบเปเบฒเบญเบดเบเบเบตเปเบกเบตเบเปเป. เปเบเบฅเบฐเบซเบงเปเบฒเบเบเบต 1973, เบงเบฝเบเบเบฒเบเบเปเบฒเบฅเบฑเบเบเปเบฒเปเบเบตเบเปเบเบทเปเบญเบเบฑเบเบเบธเบเบชเบฐเบเบฑเบเบเบตเบชเบฒเบก, kernel เปเบเปเบเบทเบเบเบฝเบเบเบทเบเปเบซเบกเปเปเบ C, เปเบฅเบฐเบเบฑเปเบเบเบฑเปเบเบชเบฐเบเบฑเบเบเบตเบชเบตเปเบเบญเบ Unix เปเบเปเปเบเบตเบเบกเบฒ.
เบเบนเปเบญเปเบฒเบเบเบปเบเบซเบเบถเปเบเปเบเปเบเบปเบเปเบซเบฑเบเบเบฒเบเบชเบฐเปเบเบเปเบญเบเบฐเบชเบฒเบเบเบตเป Doug McIlroy เบชเบฐเปเบซเบเบตเปเบเบงเบเบงเบฒเบกเบเบดเบเบเบญเบ "เปเบเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเปเบเบฑเปเบเบเปเปเบชเบงเบ."
เปเบเบเบทเปเบกเบเบญเบ Brian Kernighan
เปเบกเบทเปเบญ Unix เบเบฐเบเบปเบเบเบปเบง, เบเบงเบฒเบกเบเบฐเบเบทเบฅเบทเบฅเบปเปเบเบเบญเบเบเปเบญเบเบชเปเบฒเบฅเบฑเบ coroutines เปเบฎเบฑเบเปเบซเปเบเปเบญเบเบฎเปเบญเบเบเปเปเบซเปเบเบนเปเบเบฝเบ OS, Ken Thompson, เบญเบฐเบเบธเบเบฒเบเปเบซเปเบเปเปเบกเบนเบเบเบตเปเบเบทเบเบเบฝเบเปเบงเปเปเบเบเบฒเบเบเบฐเบเบงเบเบเบฒเบเบเปเปเบเบฝเบเปเบเปเปเบเบซเบฒเบญเบธเบเบฐเบเบญเบ, เปเบเปเบเบฑเบเปเบเบซเบฒเบเบฐเบเบงเบเบเบฒเบเบญเบทเปเบ. Ken เบเบฑเบเบชเบดเบเปเบเบงเปเบฒเบกเบฑเบเปเบเบฑเบเปเบเปเบเป. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เปเบเบเบฒเบเบฐเบเบตเปเปเบเบฑเบเบเบปเบเบซเบเปเบญเบ, เบฅเบฒเบงเบเปเบญเบเบเบฒเบเปเบซเปเบเบธเบเปเบฅเบฐเบเบปเบเบกเบตเบเบปเบเบเบฒเบเบชเปเบฒเบเบฑเบ. เบเบฒเบเบเบฝเบเปเบเบเบเบปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฐเบเบงเบเบเบฒเบเปเบกเปเบเปเบเบฑเบเบเบฐเปเบซเบเบเบญเบฑเบเปเบซเบเปเบซเบผเบงเบเบเปเปเบเบฑเบเบเบฒเบเบเบฝเบเปเบเบฅเปเบฅเบฐเบเบฑเบเบเบฒเบเบเป? เปเบฅเบฐเบเบฝเบเปเบเปเปเบกเบทเปเบญเบเปเบญเบเปเบเปเบชเบฐเปเบซเบเบตเบเปเปเบชเบฐเปเบซเบเบตเบชเบฐเปเบเบฒเบฐเบเบตเปเบกเบตเบเบทเปเบเบตเปเบซเบเปเบฒเบเบฑเบเปเบ "เบเปเป" เปเบฅเบฐเบเปเบฒเบญเบฐเบเบดเบเบฒเบเบเปเบฝเบงเบเบฑเบ syntax เบเบญเบเบเบฒเบเปเบเปเบเบญเบเบเบญเบเบเบฐเบเบงเบเบเบฒเบ, Ken เบชเบธเบเบเปเบฒเบเปเบเปเบฎเปเบญเบเบญเบญเบเบกเบฒเบงเปเบฒ: "เบเปเบญเบเบเบฐเปเบฎเบฑเบเบกเบฑเบ!".
เปเบฅเบฐเปเบเปเปเบฎเบฑเบ. เบเบญเบเปเบฅเบเปเบเบเบเบฐเบเบฒเบกเบทเปเบซเบเบถเปเบ, Ken เปเบเปเบเปเบฝเบเปเบเปเบเปเบฅเบฐเปเบเบฐ, เปเบเปเปเบเบเบฑเบเบเบฒเปเบเบเบเบฒเบเบกเบฒเบเบเบฐเบเบฒเบเบเปเบฒเบเบงเบเบซเบเบถเปเบเปเบเบทเปเบญเบกเบฒเบเบเบฐเบเบฒเบเบงเบดเบเบตเบเบฒเบเบเบญเบกเบฎเบฑเบเบเบฒเบเบเปเบญเบเบเปเปเบกเบนเบ (เปเบเบดเปเบเบญเบฒเบเบเบฐเบกเบฒเบเบฒเบเบเปเป), เปเบฅเบฐเบเปเบฝเบเบเบทเปเปเบเบฅเป. เปเบเบกเบทเปเบเปเปเบกเบฒ, เบเปเปเปเบเปเบเบทเบเบเปเบฒเปเบเปเบขเปเบฒเบเบเบงเปเบฒเบเบเบงเบฒเบเปเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบ. เปเบเบเบญเบเบเปเบฒเบเบเบญเบเบญเบฒเบเบดเบ, เปเบฅเบเบฒเบเบธเบเบฒเบเปเบเปเปเบเปเบเบงเบเปเบเบปเบฒเปเบเบทเปเบญเบชเบปเปเบเปเบญเบเบฐเบชเบฒเบเบเบฒเบเบเบปเบงเบเบฐเบกเบงเบเบเบปเบเบเปเบฒเปเบเบซเบฒเปเบเบทเปเบญเบเบเบดเบก. เบเปเปเบกเบฒ, Ken เปเบเปเบเปเบฝเบเปเบเบ API เปเบฅเบฐ syntax เบเบปเปเบเบชเบฐเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบซเปเปเบเบฒเบเบเปเบฒเปเบเปเบเปเปเบเบฑเบเบชเบปเบเบเบดเบชเบฑเบเบเบฒเบเบตเปเบชเบฐเบญเบฒเบเบเบตเปเบเบทเบเบเปเบฒเปเบเปเบเบฑเปเบเปเบเปเบเบฑเปเบเบกเบฒ.
เปเบเปเบซเบเปเบฒเปเบชเบเบเบฒเบ, เบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบเบญเบ Unix kernel เบชเบฐเบเบฑเบเบเบตเบชเบฒเบกเปเบเปเบชเบนเบเปเบชเบเปเบ. เปเบฅเบฐเปเบเบดเบเปเบกเปเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบกเบตเบฅเบฐเบซเบฑเบเปเบซเบผเปเบ kernel เบเบฝเบเปเบ C
เบเบงเบเปเบฎเบปเบฒเบกเบตเปเบญเบเบฐเบชเบฒเบเปเบญเบเบฐเบชเบฒเบเบชเปเบฒเบฅเบฑเบ pipe(2)
เบเบฒเบเบเบฑเบเบชเบญเบเบชเบฐเบเบฑเบ, เบเบฑเปเบเบเบฑเปเบเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเปเบเบเบเบฒเบเบเบปเปเบเบซเบฒเปเบญเบเบฐเบชเบฒเบ pipe(2)
เบเบทเบเบเบฝเบเปเบงเปเปเบเบเบปเบงเบเบฐเบเบญเบเปเบฅเบฐเบชเบปเปเบเบเบทเบเบเบฝเบเปเบเปเบซเบเบถเปเบเบเบปเบงเบญเบฐเบเบดเบเบฒเบเปเบเบฅเป, เปเบเปเบชเบฐเบซเบเบญเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบซเบผเบฑเบเบเบตเปเบเบฒเบเปเบงเปเปเบฅเปเบง:
เปเบเบฅเบฐเบเบปเบ เบเปเป เบชเปเบฒเบเบเบปเบเปเบ I/O เบเบตเปเปเบญเบตเปเบเบงเปเบฒ pipeline. เบเบปเบงเบญเบฐเบเบดเบเบฒเบเปเบเบฅเปเบเบตเปเบชเบปเปเบเบเบทเบเบชเบฒเบกเบฒเบเบเบทเบเบเปเบฒเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบญเปเบฒเบเปเบฅเบฐเบเบฝเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบ. เปเบกเบทเปเบญเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบทเบเบเบฝเบเปเบชเปเบเปเป, เบกเบฑเบ buffers เปเบเบดเบ 504 bytes เบเบญเบเบเปเปเบกเบนเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฐเบเบงเบเบเบฒเบเบเบฝเบเบเบทเบเปเบเบฐ. เปเบกเบทเปเบญเบญเปเบฒเบเบเบฒเบเบเปเป, เบเปเปเบกเบนเบเบเบตเปเบเบทเบ buffed เปเบเปเบเบทเบเบเบฐเบเบดเบเบฑเบ.
เปเบเบเบตเบเปเปเบกเบฒ, kernel เปเบเปเบเบทเบเบเบฝเบเบเบทเบเปเบซเบกเปเปเบ C, เปเบฅเบฐ pipe(fildes)
"
เปเบเบฅเบฐเบเบปเบ เบเปเป เบชเปเบฒเบเบเบปเบเปเบ I/O เบเบตเปเปเบญเบตเปเบเบงเปเบฒเบเปเปเบชเบปเปเบ. เบเบปเบงเบญเบฐเบเบดเบเบฒเบเปเบเบฅเปเบเบตเปเบชเบปเปเบเบเบทเบเบชเบฒเบกเบฒเบเบเบทเบเบเปเบฒเปเบเปเปเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฒเบเบญเปเบฒเบเปเบฅเบฐเบเบฝเบ. เปเบกเบทเปเบญเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบทเบเบเบฝเบเปเบชเปเบเปเป, เบเบปเบงเบญเบฐเบเบดเบเบฒเบเบเบฑเบเบเบทเบเปเบ r1 (resp. fildes[1]) เบเบทเบเบเปเบฒเปเบเป, buffed เปเบเบดเบ 4096 bytes เบเบญเบเบเปเปเบกเบนเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฐเบเบงเบเบเบฒเบเบเบฝเบเบเบทเบเปเบเบฐ. เปเบกเบทเปเบญเบญเปเบฒเบเบเบฒเบเบเปเป, เบเบปเบงเบญเบฐเบเบดเบเบฒเบเบเบฑเบเบเบทเบเปเบเบซเบฒ r0 (resp. fildes[0]) เปเบญเบปเบฒเบเปเปเบกเบนเบ.
เบกเบฑเบเบชเบปเบกเบกเบธเบเบงเปเบฒเปเบกเบทเปเบญเบเปเปเปเบเปเบเบทเบเบเปเบฒเบเบปเบ, เบชเบญเบ (เบซเบผเบทเบซเบผเบฒเบเบเบงเปเบฒ) เบเบฐเบเบงเบเบเบฒเบเบเบฐเบเบดเบชเปเบฒเบเบฑเบ (เบชเปเบฒเบเปเบเบเบเบฒเบเบฎเบฝเบเบฎเปเบญเบเบเปเปเปเบ. fork) เบเบฐเบเปเบฒเบเบเปเปเบกเบนเบเบเบฒเบเบเปเปเปเบเบเปเบเปเบเบฒเบเปเบ เบญเปเบฒเบ ะธ เบเบฝเบ.
Shell เบกเบต syntax เบชเปเบฒเบฅเบฑเบเบเปเบฒเบเบปเบ array linear เบเบญเบเบเบฐเบเบงเบเบเบฒเบเบเบตเปเปเบเบทเปเบญเบกเบเปเปเบเปเบฒเบเบเปเป.
เปเบเบซเบฒเปเบเบทเปเบญเบญเปเบฒเบเบเบฒเบเบเปเปเบซเบงเปเบฒเบเปเบเบปเปเบฒ (เบเปเปเบกเบตเบเปเปเบกเบนเบเบเบตเปเบกเบต buffered) เบเบตเปเบกเบตเบเบธเบเบเบปเบเบเบฝเบเปเบเปเบซเบเบถเปเบ (เบเบปเบงเบญเบฐเบเบดเบเบฒเบเปเบเบฅเปเบเบฑเบเบซเบกเบปเบเบเบตเปเบเบดเบ) เบเบฑเบเบเบทเบ "เบชเบดเปเบเบชเบธเบเบเบญเบเปเบเบฅเป". เบเบฝเบเบเบฒเบเปเบเปเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบเปเบกเปเบเบเบทเบเบฅเบฐเปเบฅเบตเบ.
เปเบงเบเบตเปเบชเบธเบ
Unix เบชเบฐเบเบฑเบเบเบตเบซเบปเบ (1975)
เปเบฅเบตเปเบกเบญเปเบฒเบเบฅเบฐเบซเบฑเบเปเบซเบผเปเบ Unix
เบชเปเบฒเบฅเบฑเบเปเบงเบฅเบฒเบซเบผเบฒเบเบเบตเบซเบเบฑเบเบชเบท เบเปเบฒเบ เปเบเบฑเบเปเบญเบเบฐเบชเบฒเบเบเบฝเบงเปเบ kernel Unix เบเบตเปเบกเบตเบขเบนเปเปเบ Bell Labs. เปเบเบดเบเปเบกเปเบเบงเปเบฒเปเบเบญเบฐเบเบธเบเบฒเบเบชเบฐเบเบฑเบเบเบต XNUMX เปเบเปเบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบนเบชเบญเบเปเบเปเบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบเบญเบเบกเบฑเบ, เปเบเปเปเบเบญเบฐเบเบธเบเบฒเบเบชเบฐเบเบฑเบเบเบต XNUMX เบเปเปเปเบเปเบฅเบงเบกเปเบญเบปเบฒเบเบงเบฒเบกเปเบเบฑเบเปเบเปเบเปเบเบตเป, เบเบฑเปเบเบเบฑเปเบเบเบทเปเบกเบเบฑเปเบเบเปเบฒเบงเปเบเปเบเบทเบเปเบเบเบขเบฒเบเปเบเบชเปเบฒเปเบเบปเบฒเบเบตเปเบเบฝเบเบเบดเบเบเบปเบเบซเบกเบฒเบ.
เบกเบทเปโเบเบตเปโเปเบเบปเปเบฒโเบชเบฒเบกเบฒเบโเบเบทเปโเบเบถเปเบกโเบเบตเปโเบเบดเบกโเบเบทเบโเปเปเปโเปเบเป, เปเปเบฒโเบเบปเบโเบเบตเปโเบชเบฐโเปเบเบโเปเบซเปโเปเบซเบฑเบโเบเบฑเบโเบชเบถเบเบชเบฒโเบขเบนเปโเปเบโเปเบเบทเปเบญเบโเบชเบณเปเบเบปเบฒ. เปเบฅเบฐเบเปเบเบญเบเปเบเบเบฑเบ Warren Toomey (เบเบนเปเบเบตเปเปเบเปเปเบฅเบตเปเบกเบเบปเปเบเปเบเบเบเบฒเบ TUHS), เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฒเบงเปเบซเบฅเบเปเบเป
เบซเบผเบฒเบเบเบงเปเบฒ 15 เบเบตเบเปเบญเบเบซเบเปเบฒเบเบตเป, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบดเบกเบชเปเบฒเปเบเบปเบฒเบเบญเบเบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบเบตเปเบชเบฐเบซเบเบญเบเปเบซเปเบขเบนเปเปเบ เบเปเบฒเบเปเบเบฒเบฐเบงเปเบฒเบเปเบญเบเบเปเปเบกเบฑเบเบเบธเบเบเบฐเบเบฒเบเบเบญเบเบชเบณเปเบเบปเบฒเบเบญเบเบเปเบญเบเบเบฒเบเบชเบณเปเบเบปเบฒเบญเบทเปเบเบเบตเปเบเปเปเบฎเบนเปเบเบฑเบ. TUHS เบเบฑเบเบเปเปเบเบฑเบเบกเบตเปเบเบทเปเบญ, เปเบฅเบฐเบเปเบญเบเบเปเปเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบซเบผเปเบเปเบเบปเปเบฒ. เปเบเปโเปเบโเบเบต 1988 เบเปเบฒโเบเบฐโเปเบเบปเปเบฒโเปเบเปโเบเบปเบโเปเบซเบฑเบ tape เปเบเบปเปเบฒโเบเบตเปโเบกเบต 9 เปเบเบโเบเบตเปโเบกเบตโเบชเปเบฒโเบฎเบญเบโเบเปเปโเบกเบนเบโเบเบฒเบโเบเบญเบกโเบเบดเบงโเปเบเบต PDP11โ. เบกเบฑเบเปเบเบฑเบเบเบฒเบเบเบฒเบเบเบตเปเบเบฐเบฎเบนเปเบงเปเบฒเบกเบฑเบเปเบฎเบฑเบเบงเบฝเบ, เปเบเปเบงเปเบฒเบกเบตเบเบปเปเบเปเบกเป /usr/src/ intact เบเบตเปเปเบเบฅเปเบชเปเบงเบเปเบซเบเปเบเบทเบเบซเบกเบฒเบเปเบเบเบต 1979, เปเบเบดเปเบเปเบเบดเบเปเบกเปเบเบงเปเบฒเปเบเบดเปเบเบเบทเปเบเบปเปเบฒ. เบกเบฑเบเปเบกเปเบเบชเบฐเบเบฑเบเบเบตเปเบเบฑเบ, เบซเบผเบทเปเบเบฑเบเบญเบฐเบเบธเบเบฑเบ PWB, เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบดเบเบงเปเบฒ.
เบเปเบฒโเบเบฐโเปเบเบปเปเบฒโเปเบเปโเปเบญเบปเบฒโเบเบฒเบโเบเบญเบโเบซเบฒโเปเบเบฑเบโเบเบทเปเบโเบเบฒเบโเปเบฅเบฐโเบเบนเปโเบกเบทโเบเบฒเบโเปเบเปโเปเบโเปเบซเบผเปเบโเบเปเปโเบกเบนเบโเบเบญเบโเบเบฒเบโเบชเบฐโเบเบฑเบโเบเบตโเบซเบปเบโ. เบเบฒเบเบชเปเบงเบเบเบญเบเบฅเบฐเบซเบฑเบเบเบฑเบเบเบปเบเบเบทเปเบเบปเปเบฒ, เบเบฒเบเบชเปเบงเบเบเปเบญเบเปเบเปเบฎเบฑเบเบเบฒเบเปเบเปเปเบเปเบฅเบฑเบเบเปเบญเบ, เบเบฒเบเบเปเบฝเบเปเบเบ token เบเบตเปเบเบฑเบเบชเบฐเปเบซเบก += เปเบเบฑเบเบฅเปเบฒเบชเบฐเปเบซเบก =+. เบเบฒเบโเบชเบดเปเบโเบเบฒเบโเบขเปเบฒเบโเบเบทเบโเบฅเบปเบโเบญเบญเบโเบขเปเบฒเบโเบเปเบฒเบโเบเบฒเบ, เปเบฅเบฐโเบเบฒเบโเบชเบดเปเบโเบเบฒเบโเบขเปเบฒเบโเบเปเบญเบโเปเบเปโเบฎเบฑเบโเบเบฒเบโเบเบฝเบโเบเบทเบโเปเบซเบกเปโเบเบฑเบโเบซเบกเบปเบ, เปเบเปโเบเปเปโเบซเบผเบฒเบโเปเบเบตเบโเปเบ.
เปเบฅเบฐเบกเบทเปเบเบตเปเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบญเปเบฒเบเบญเบญเบเปเบฅเบเปเบขเบนเป TUHS เบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบเบญเบเบชเบฐเบเบฑเบเบเบต VI เบเบญเบ
เปเบเบเบงเบดเบเบตเบเบฒเบเบเบฒเบ, เบขเบนเป glance เบเปเบฒเบญเบดเบ, เบฅเบฑเบเบชเบฐเบเบฐเบเบปเปเบเบเปเบเบญเบเบฅเบฐเบซเบฑเบ 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
file descriptor เบชเปเบฒเบฅเบฑเบเบเบฒเบเบญเปเบฒเบเปเบฅเบฐเบกเบญเบเบซเบกเบฒเบ descriptor เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฝเบเปเบเบเบเบปเบเบเบฒเบ 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;
}
เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเบฝเบ bytes เปเบเบปเปเบฒเปเบเบเบฒเบเบเปเบญเบเบเปเปเบกเบนเบเบเปเป u.u_count
. เบเปเบฒเบญเบดเบเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบฅเบฑเบญเบ inode (เปเบเบดเปเบเบเปเบฒเบเบฅเบธเปเบกเบเบตเป plock
/prele
).
เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบงเบเปเบเบดเปเบเบเบฒเบเบเบฑเบเบญเปเบฒเบเบญเบตเบ inode. เบเบฒเบเปเบเบเบตเปเบเบฑเบเบชเบญเบเบชเบปเปเบเบเบญเบเบเปเปเบเบฑเบเปเบเบตเบเบขเบนเป, เปเบเบปเบฒเปเบเบตเบเบงเบเบเบฐเปเบเบฑเบ 2. เบเบงเบเปเบฎเบปเบฒเบเบถเบเบเบดเบเบเบฑเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบฝเบง (เบเบฒเบ. rp->f_inode
), เบเบฑเปเบเบเบฑเปเบเบเปเบฒ counter เบซเบเปเบญเบเบเบงเปเบฒ 2, เบเบตเปเบเบงเบเบเบฐเบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเบเบฐเบเบงเบเบเบฒเบเบญเปเบฒเบเปเบเปเบเบดเบเบเปเบฒเบเบเบญเบเบเปเปเบเบญเบเบกเบฑเบ. เปเบเบเปเบฒเบชเบฑเบเบเปเบฒเบเปเบญเบทเปเบเป, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเบเบฐเบเบฒเบเบฒเบกเบเบฝเบเปเบเบดเบเบเปเปเบเบดเบ, เปเบเบดเปเบเปเบเบฑเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ. เบฅเบฐเบซเบฑเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบญเบดเบ EPIPE
เปเบฅเบฐเบชเบฑเบเบเบฒเบ SIGPIPE
เบเบฐเบเบปเบเบขเบนเปเปเบเบชเบฐเบเบฑเบเบเบต VI เบเบญเบ Unix.
เปเบเปเปเบเบดเบเปเบกเปเบเบงเปเบฒ conveyor เปเบเบตเบ, เบกเบฑเบเบชเบฒเบกเบฒเบเปเบเบฑเบก. เปเบเบเปเบฅเบฐเบเบตเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเปเบญเบ lock เปเบฅเบฐเปเบเบเบญเบเปเบเบเบงเบฒเบกเบซเบงเบฑเบเบงเปเบฒเบเบฐเบเบงเบเบเบฒเบเบญเบทเปเบเบเบฐเบญเปเบฒเบเบเบฒเบเบเปเปเปเบฅเบฐเบชเปเบฒเบเบเบทเปเบเบเบตเปเบซเบงเปเบฒเบเบเบฝเบเบเปเปเบเบกเบฑเบ. เปเบกเบทเปเบญเบเบงเบเปเบฎเบปเบฒเบเบทเปเบเบเบถเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฑเบเบเบทเบเบชเบนเปเบเบธเบเปเบฅเบตเปเบกเบเบปเปเบ, เบงเบฒเบเบชเบฒเบเบฅเบฑเบญเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบเปเบฅเบฐเปเบฅเบตเปเบกเบเบปเปเบเบงเบปเบเบเบญเบเบเบฒเบเบเบฝเบเปเบซเบกเป.
เบเปเบฒเบกเบตเบเบทเปเบเบเบตเปเบซเบงเปเบฒเบเบเบฝเบเบเปเปเบเบเปเป, เบเบงเบเปเบฎเบปเบฒเบเบฝเบเบเปเปเบกเบนเบเปเบชเปเบกเบฑเบเปเบเบเปเบเป i_size1
inode'a (เบกเบตเบเปเปเปเบเบปเปเบฒเบชเบฒเบกเบฒเบเปเบเบปเปเบฒเบเบฑเบ 0) เบเบตเปเปเบซเปเปเบซเบฑเบเปเบเบดเบเบเบธเบเบชเบดเปเบเบชเบธเบเบเบญเบเบเปเปเบกเบนเบเบเบตเปเบกเบฑเบเบกเบตเบขเบนเปเปเบฅเปเบง. เบเปเบฒเบกเบตเบเบทเปเบเบเบตเปเบเบฝเบเบเปเบเบตเปเบเบฐเบเบฝเบ, เบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบทเปเบกเบเปเปเบกเบนเบเปเบชเปเบเปเปเบเบฒเบ i_size1
เบเบฒเบ PIPESIZ
. เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบปเบงเบฅเบฑเบญเบเปเบฅเบฐเบเบฐเบเบฒเบเบฒเบกเบเบธเบเบเบฐเบเบงเบเบเบฒเบเปเบเปเบเบตเปเบฅเปเบเปเบฒเบเบฒเบเบญเปเบฒเบเบเบฒเบเบเปเป. เบเบงเบเปเบฎเบปเบฒเบเบฑเบเบเบทเบเปเบเบซเบฒเบเบธเบเปเบฅเบตเปเบกเบเบปเปเบเปเบเบทเปเบญเปเบเบดเปเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเบเบเบฒเบเบเบฒเบเบเบฝเบเบซเบผเบฒเบ bytes เปเบเบปเปเบฒเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบ. เบเปเบฒเบเปเป, เบเบงเบเปเบฎเบปเบฒเปเบฅเบตเปเบกเบเบปเปเบเบฎเบญเบเบเบฑเบเบเบถเบเปเบซเบกเป.
เบเบปเบเบเบฐเบเบดเปเบฅเปเบงเบเบฒเบฅเบฒเบกเบดเปเบเบต i_mode
inode เบเบทเบเบเปเบฒเปเบเปเปเบเบทเปเบญเปเบเบฑเบเบฎเบฑเบเบชเบฒเบเบฒเบเบญเบฐเบเบธเบเบฒเบ r
, w
ะธ x
. เปเบเปเปเบเบเปเบฅเบฐเบเบตเบเบญเบเบเปเป, เบเบงเบเปเบฎเบปเบฒเบชเบฑเบเบเบฒเบเบงเปเบฒเบเบฐเบเบงเบเบเบฒเบเบเบฒเบเบขเปเบฒเบเปเบกเปเบเบฅเปเบเปเบฒเบเบฒเบเบเบฝเบเบซเบผเบทเบญเปเบฒเบเปเบเบเปเบเป bits IREAD
ะธ IWRITE
เบเบฒเบกเบฅเปเบฒเบเบฑเบ. เบเบฐเบเบงเบเบเบฒเบเบเปเบฒเบเบปเบเบเบธเบเปเบฅเบฐเปเบเบซเบฒ sleep()
, เปเบฅเบฐเบเบฒเบเบงเปเบฒเปเบเบญเบฐเบเบฒเบเบปเบเบเบฒเบเบเบฐเบเบงเบเบเบฒเบเบญเบทเปเบเปเบเบฐเปเบเบซเบฒ wakeup()
.
magic เบเบตเปเปเบเปเบเบดเบเปเบเบตเบเบเบถเปเบเปเบ sleep()
ะธ wakeup()
. เบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบเปเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบ
/*
* 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()
เปเบกเบทเปเบญเบกเบฑเบเบเบฝเบเบเปเปเบกเบนเบเบเบฒเบเบขเปเบฒเบเปเบชเปเบเปเปเบเบฑเปเบ.
เบเปเบฒเปเบซเบฑเบเบเปเบฝเบงเบเบฑเบ u
ยป เบเบงเบโเปเบฎเบปเบฒโเบชเบฒโเบกเบฒเบโเบเบฐโเบเบดโเบเบฑเบโเปเบซเปโเปเบเบปเบฒโเปเบเบปเปเบฒโเบเบทโเบซเบเปเบฒโเบเบตเป I/O เบเบปเบโเบเบฐโเบเบดโเบเบตเปโเปเบเปโเปเบเบฅโเปโ, เบเปเบฒโเปเบซเบเปเบโ, buffer เปเบโเบซเบเปเบงเบโเบเบงเบฒเบกโเบเปเบฒโ, เปเบฅเบฐโเบเบฑเบโเบเปเบฒโเบเบงเบโเบเบญเบ bytes เบเบตเปโเบเบฐโเบญเปเบฒเบโเบซเบผเบทโเบเบฝเบโ.
/*
* Read the file corresponding to
* the inode pointed at by the argument.
* The actual read arguments are found
* in the variables:
* u_base core address for destination
* u_offset byte offset in file
* u_count number of bytes to read
* u_segflg read to kernel/user
*/
readi(aip)
struct inode *aip;
/* โฆ */
/*
* Write the file corresponding to
* the inode pointed at by the argument.
* The actual write arguments are found
* in the variables:
* u_base core address for source
* u_offset byte offset in file
* u_count number of bytes to write
* u_segflg write to kernel/user
*/
writei(aip)
struct inode *aip;
/* โฆ */
เปเบเบเบฒเบเบฐเปเบเบฑเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเบฐเบเบฑเบ "เบญเบฐเบเบธเบฅเบฑเบ", เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ readp()
ะธ writep()
lock inodes เบเบปเบเบเปเบงเบฒเบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเบชเปเบฒเปเบฅเบฑเบเบซเบผเบทเปเบเปเบฎเบฑเบเบเบปเบเปเบเปเบฎเบฑเบ (เปเบเบฑเปเบ: เปเบ wakeup
). plock()
ะธ prele()
เปเบฎเบฑเบเบงเบฝเบเบเปเบฒเบเป: เปเบเปเบเบธเบเบเบฒเบเปเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ sleep
ะธ wakeup
เบญเบฐเบเบธเบเบฒเบเปเบซเปเบเบงเบเปเบฎเบปเบฒเบเบธเบเบเบฐเบเบงเบเบเบฒเบเปเบเปเบเบตเปเบเปเบญเบเบเบฒเบเบฅเบฑเบญเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบซเบฒเบเปเบเปเบญเบเบญเบญเบเบกเบฒ:
/*
* Lock a pipe.
* If its already locked, set the WANT bit and sleep.
*/
plock(ip)
int *ip;
{
register *rp;
rp = ip;
while(rp->i_flag&ILOCK) {
rp->i_flag =| IWANT;
sleep(rp, PPIPE);
}
rp->i_flag =| ILOCK;
}
/*
* Unlock a pipe.
* If WANT bit is on, wakeup.
* This routine is also used to unlock inodes in general.
*/
prele(ip)
int *ip;
{
register *rp;
rp = ip;
rp->i_flag =& ~ILOCK;
if(rp->i_flag&IWANT) {
rp->i_flag =& ~IWANT;
wakeup(rp);
}
}
เบเปเบฒเบญเบดเบเบเปเบญเบเบเปเปเปเบเบปเปเบฒเปเบเบงเปเบฒเปเบเบฑเบเบซเบเบฑเบ readp()
เบเปเปเปเบเปเปเบฎเบฑเบเปเบซเปเปเบเบตเบ prele(ip)
เบเปเบญเบเบเบฒเบเปเบ wakeup(ip+1)
. เบชเบดเปเบเบเปเบฒเบญเบดเบ writep()
เปเบเบซเบฒเปเบ loop เบเบญเบเบเบปเบ, เบเบตเป plock(ip)
, เปเบเบดเปเบเบชเบปเปเบเบเบปเบเปเบซเปเบกเบตเบเบฒเบเบขเบธเบเปเบเบปเบฒเบเปเบฒ readp()
เบเบฑเบเบเปเปเบเบฑเบเปเบเปเปเบญเบปเบฒเบเบฅเบฑเบญเบเบเบญเบเบกเบฑเบเบญเบญเบเปเบเบทเปเบญ, เบเบฑเปเบเบเบฑเปเบเบฅเบฐเบซเบฑเบเบเบฐเบเปเบญเบเปเบฎเบฑเบเบงเบฝเบเบขเปเบฒเบเบเบทเบเบเปเบญเบ. เบเปเบฒเบเปเบฒเบเปเบเบดเปเบ wakeup()
, เบกเบฑเบเบเบฐเบเบฒเบเปเบเบฑเบเบเบตเปเบเบฑเบเปเบเบเบงเปเบฒเบกเบฑเบเบเบฝเบเปเบเป marks เบเบฐเบเบงเบเบเบฒเบเบเบญเบเปเบกเปเบเบเบฝเบกเบเปเบญเบกเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ, เบเบฑเปเบเบเบฑเปเบเปเบเบญเบฐเบเบฒเบเบปเบ sched()
เปเบเบตเบเบเบปเบงเปเบเปเป. เบเบฑเปเบเบเบฑเปเบ readp()
เบชเบฒเปเบซเบ wakeup()
, unlocks, เบเบธเบ IREAD
เปเบฅเบฐเบเบฒเบเปเบ sleep(ip+2)
- เบเบฑเบเบซเบกเบปเบเบเบตเปเบเปเบญเบ writep()
เบฃเบตเบชเบฐเบเบฒเบเบฎเบญเบเบงเบฝเบ.
เบเบตเปเปเบฎเบฑเบเบชเปเบฒเปเบฅเบฑเบเบเปเบฒเบญเบฐเบเบดเบเบฒเบเบเปเบฝเบงเบเบฑเบเบเปเปเปเบเบชเบฐเบเบฑเบเบเบตเบซเบปเบ. เบฅเบฐเบซเบฑเบเบเปเบฒเบเบเบฒเบ, เบเบปเบเบชเบฐเบเปเบญเบเปเบ.
Xv6, เปเบเบฑเบเปเบเปเบเบเบตเปเบเปเบฒเบเบเบท Unix เบเปเบฒเบเบเบฒเบ
เปเบเบทเปเบญเบชเปเบฒเบเบเบดเบงเปเบเบฅเบ
เบฅเบฐเบซเบฑเบเบเบฐเบเบญเบเบกเบตเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบตเปเบเบฑเบเปเบเบเปเบฅเบฐเบเบดเบ pipealloc()
:
#define PIPESIZE 512
struct pipe {
struct spinlock lock;
char data[PIPESIZE];
uint nread; // number of bytes read
uint nwrite; // number of bytes written
int readopen; // read fd is still open
int writeopen; // write fd is still open
};
int
pipealloc(struct file **f0, struct file **f1)
{
struct pipe *p;
p = 0;
*f0 = *f1 = 0;
if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0)
goto bad;
if((p = (struct pipe*)kalloc()) == 0)
goto bad;
p->readopen = 1;
p->writeopen = 1;
p->nwrite = 0;
p->nread = 0;
initlock(&p->lock, "pipe");
(*f0)->type = FD_PIPE;
(*f0)->readable = 1;
(*f0)->writable = 0;
(*f0)->pipe = p;
(*f1)->type = FD_PIPE;
(*f1)->readable = 0;
(*f1)->writable = 1;
(*f1)->pipe = p;
return 0;
bad:
if(p)
kfree((char*)p);
if(*f0)
fileclose(*f0);
if(*f1)
fileclose(*f1);
return -1;
}
pipealloc()
เบเปเบฒเบเบปเบเบชเบฐเบเบฒเบเบฐเบเบญเบเบชเปเบงเบเบเบตเปเปเบซเบผเบทเบญเบเบฑเบเบซเบกเบปเบเบเบญเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ, เปเบเบดเปเบเบเบฐเบเบญเบเบกเบตเบซเบเปเบฒเบเบตเป piperead()
, pipewrite()
ะธ pipeclose()
. เปเบเบฅเบฐเบเบปเบเบเบปเบงเบเบดเบ sys_pipe
เปเบเบฑเบ wrapper เบเบฐเบเบดเบเบฑเบเปเบ
Linux 0.01
เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบญเบเบซเบฒเบฅเบฐเบซเบฑเบเปเบซเบผเปเบเบชเปเบฒเบฅเบฑเบ Linux 0.01. เบกเบฑเบเบเบฐเปเบเบฑเบเบเปเบฒเปเบเบฐเบเปเบฒเบเบตเปเบเบฐเบชเบถเบเบชเบฒเบเบฒเบเบเบฑเบเบเบฑเปเบเบเบฐเบเบดเบเบฑเบเบเปเปเบขเบนเปเปเบเบฅเบฒเบง fs
/pipe.c
. เปเบเบเบตเปเบเบตเป, inode เบเบทเบเบเปเบฒเปเบเปเปเบเบทเปเบญเปเบเบฑเบเบเบปเบงเปเบเบเบเบญเบเบเปเป, เปเบเปเบเปเปเบเบฑเปเบเปเบญเบเปเบกเปเบเบเบฝเบเปเบ C เบเบตเปเบเบฑเบเบชเบฐเปเบซเบก. เบเปเบฒเบเปเบฒเบเปเบเป hack เบงเบดเบเบตเบเบฒเบเบเบญเบเบเปเบฒเบเบเปเบฒเบเบฅเบฐเบซเบฑเบเบชเบฐเบเบฑเบเบเบต XNUMX, เบเปเบฒเบเบเบฐเบเปเปเบกเบตเบเบฑเบเบซเบฒเปเบเปเบขเบนเปเบเบตเปเบเบตเป. เบเบตเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบซเบเปเบฒเบเบตเปเปเบเบดเปเบเบเบทเบงเปเบฒ write_pipe()
:
int write_pipe(struct m_inode * inode, char * buf, int count)
{
char * b=buf;
wake_up(&inode->i_wait);
if (inode->i_count != 2) { /* no readers */
current->signal |= (1<<(SIGPIPE-1));
return -1;
}
while (count-->0) {
while (PIPE_FULL(*inode)) {
wake_up(&inode->i_wait);
if (inode->i_count != 2) {
current->signal |= (1<<(SIGPIPE-1));
return b-buf;
}
sleep_on(&inode->i_wait);
}
((char *)inode->i_size)[PIPE_HEAD(*inode)] =
get_fs_byte(b++);
INC_PIPE( PIPE_HEAD(*inode) );
wake_up(&inode->i_wait);
}
wake_up(&inode->i_wait);
return b-buf;
}
เปเบเบดเบเปเบกเปเบเบงเปเบฒเบเปเปเปเบเปเปเบเบดเปเบเบเปเบฒเบเบดเบเบฒเบกเบเบญเบเปเบเบเบชเปเบฒเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบดเบเบญเบญเบเบงเบดเบเบตเบเบฒเบเบเปเบฒเบเบงเบเบเบฒเบเบญเปเบฒเบเบญเบดเบ inode เบเบทเบเบเปเบฒเปเบเปเปเบเบทเปเบญเบเบงเบเปเบเบดเปเบเบงเปเบฒเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฝเบเบเบปเบเปเบเปเบฎเบฑเบเปเบ. SIGPIPE
. เบเบญเบเปเบซเบเบทเบญเบเบฒเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบ byte-by-byte, เบซเบเปเบฒเบเบตเปเบเบตเปเปเบกเปเบเบเปเบฒเบเบเบตเปเบเบฐเบเบฝเบเบเบฝเบเบเบฑเบเปเบเบงเบเบงเบฒเบกเบเบดเบเบเปเบฒเบเปเบเบดเบ. เปเบเบดเบเปเบกเปเบเบงเปเบฒเปเบซเบเบเบปเบ sleep_on
/wake_up
เบเปเปเปเบเปเปเบเบดเปเบเบเบทเบกเบฐเบเบธเบเบเปเบฒเบเบเบฒเบง.
Linux Kernels เบเบตเปเบเบฑเบเบชเบฐเปเบซเบก, FreeBSD, NetBSD, OpenBSD
เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบเบเปเบฒเบเปเบเปเบเบเบตเปเบเบฑเบเบชเบฐเปเบซเบกเบเบฒเบเบญเบฑเบเบขเปเบฒเบเปเบงเบงเบฒ. เบเปเปเบกเบตเปเบเปเบเบเบงเบเบกเบฑเบเบกเบตเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบตเปเบญเบตเบเปเบชเปเปเบเปเบ (เบเปเปเปเบเบเปเบ). Linux เบกเบตเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบญเบเบเบปเบเปเบญเบ. เปเบฅเบฐเปเบเบดเบเปเบกเปเบเบงเปเบฒเบชเบฒเบกเปเบกเบฑเบ BSD เบเบตเปเบเบฑเบเบชเบฐเปเบซเบกเบเบฐเบเบญเบเบเปเบงเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเปเบเบเบญเบตเบเปเบชเปเบฅเบฐเบซเบฑเบเบเบตเปเบเบทเบเบเบฝเบเปเบเบ John Dyson, เปเบเปเบฅเบเบฐเบเบตเบเบตเปเบเปเบฒเบเบกเบฒเบเบงเบเปเบเบปเบฒเปเบเปเบเบฒเบเปเบเบฑเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเปเบเบตเบเปเบเบเบฒเบเบเบฑเบเปเบฅเบฐเบเบฑเบ.
เบญเปเบฒเบ fs
/pipe.c
(เปเบ Linux) เบซเบผเบท sys
/kern
/sys_pipe.c
(เปเบ *BSD), เบกเบฑเบเปเบเปเปเบงเบฅเบฒเบเบฒเบเบญเบธเบเบดเบเบเบตเปเปเบเปเบเบดเบ. เบเบฐเบชเบดเบเบเบดเบเบฒเบ เปเบฅเบฐเบเบฒเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเบเบธเบเบชเบปเบกเบเบฑเบเปเบเบฑเปเบ vector เปเบฅเบฐ asynchronous I/O เปเบกเปเบเบกเบตเบเบงเบฒเบกเบชเปเบฒเบเบฑเบเปเบเบฅเบฐเบซเบฑเบเปเบเบกเบทเปเบเบตเป. เปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบเบเบญเบเบเบฒเบเบเบฑเบเบชเบฑเบเบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒ, locks, เปเบฅเบฐเบเบฒเบเบเบฑเปเบเบเปเบฒ kernel เบเบฑเบเบซเบกเบปเบเปเบเบเบเปเบฒเบเบเบฑเบเบขเปเบฒเบเบซเบผเบงเบเบซเบผเบฒเบ. เบเบตเปเบเปเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบกเบฐเบซเบฒเบงเบดเบเบฐเบเบฒเปเบฅเบเปเบญเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเบซเบผเบฑเบเบชเบนเบเปเบเบฐเบเปเบฒเบเปเบฝเบงเบเบฑเบเบฅเบฐเบเบปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบ.
เปเบเบเปเบฅเบฐเบเบตเปเบเบเปเปเบเบฒเบก, เบกเบฑเบเบซเบเปเบฒเบชเบปเบเปเบเบชเปเบฒเบฅเบฑเบเบเปเบญเบเบเบตเปเบเบฐเบเบปเปเบเบเบปเบเบฎเบนเบเปเบเบเปเบเบปเปเบฒเบเปเบฒเบเบงเบเบซเบเปเบญเบ (เบเบปเบงเบขเปเบฒเบ, เบเบฒเบเบชเปเบฒเบ SIGPIPE
เปเบฅเบฐเบเบฑเบเบเบทเบ EPIPE
เปเบกเบทเปเบญเบเบฝเบเปเบชเปเบเปเปเบเบดเบ) เปเบเบเบฑเบเบซเบกเบปเบเปเบซเบผเบปเปเบฒเบเบตเป, เบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ, เปเบเปเบเบเบตเปเบเบฑเบเบชเบฐเปเบซเบก. เบเปเบญเบเบญเบฒเบเบเบฐเบเปเปเปเบเบตเบเปเบซเบฑเบเบเบญเบกเบเบดเบงเปเบเบต PDP-11 เบกเบตเบเบตเบงเบดเบเบขเบนเป, เปเบเปเบเบฑเบเบกเบตเบซเบผเบฒเบเบขเปเบฒเบเบเบตเปเบเบฐเบฎเบฝเบเบฎเบนเปเบเบฒเบเบฅเบฐเบซเบฑเบเบเบตเปเบเบฝเบเปเบงเปเบชเบญเบเบชเบฒเบกเบเบตเบเปเบญเบเบเปเบญเบเปเบเบตเบ.
เบเบฝเบเปเบเบ Divi Kapoor เปเบเบเบต 2011, เบเบปเบเบเบงเบฒเบก "
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com