แแก แกแขแแขแแ แแฆแฌแแ แก แแแแกแแแแแแแแก แแแแฎแแ แชแแแแแแแก Unix แแแ แแแจแ. แแ แแแ แแแแฃแแฌแแแแ แแแแแแแชแ แฃแแแฃแแ แแแงแแแ, แ แแ แแแแ แกแขแแขแแ แกแแแแฃแ แแ "
แ แแแ แแกแแฃแแ แแแ?
Pipelines, "แแแแแ แงแแแแแแ แแแแจแแแแแแแแแ แแแแแแแแแแ Unix-แจแ", แแ แแก Unix-แแก แซแแ แแแแแ แคแแแแกแแคแแแก แแแแแกแแแฆแแ แแแ แแแฎแแกแแแแแแแแ แแชแแ แ แแ แแแ แแแแแแก แแ แแแแแแแแแ แแแแแแจแแ แแแแก แจแแกแแฎแแ, แแกแแแ แ แแแแ แช แแแชแแแแ แแแจแแแ แแ แซแแแแแแก แฎแแแแ:
$ 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()
แแแแแแขแแแแแฃแแ แคแแแแแก แแฆแฌแแ แแก แแแกแแฆแแแแ. แแ แแ แแแแจแแแก แแ แแชแแกแ แฌแแ แก แแ แ แกแแฎแแแฃแ แแ, แฎแแแ แแแแ แ แแ แแชแแกแ แแแแฎแฃแแแแก แแแแแ แแแแแชแแแแแก แแแแ แ แกแแฎแแแฃแ แแแแ. แญแฃแ แแ แแงแแแแแก dup2-แก 3 แแ 4 แแแกแแ แแแขแแ แแแแก "แแแแแ แฅแแแแแกแแแแก" stdin-แแกแ แแ stdout-แแก แจแแกแแขแงแแแกแแ.
แแแแแแแก แแแ แแจแ, แญแฃแ แแ แฃแแแ แฉแแฌแแ แแก แแ แแ แแ แแชแแกแแก แจแแแแแ แคแแแแจแ แแ แแแแแกแชแแก แกแฎแแ แแ แแชแแกแก แคแแแแแแแ แแแแแชแแแแแแก แฌแแกแแแแแฎแแ. แจแแแแแแ, แฉแแแ แแแแฎแแ แฏแแแ แแแข แ แแกแฃแ แกแก แแ แแแแแแก แแแกแแแ. แแฃแแชแ, แแแแกแแแแแแแ แแแ แแแ แแ แ แแฎแแแแ แแแแขแแ, แ แแ แแกแแแ แกแแจแฃแแแแแแก แแแซแแแแ แแแแแแแ แแแชแแแแ แแ แแแแแแ แคแแแแแแแก แแแแแงแแแแแ:
แแฃ แแ แแชแแกแ แชแแแแแแก แฌแแแแแแฎแแก แชแแ แแแแ แแแแกแแแแแแแแ, แแแจแแ
read(2)
แแแแแแแแแแ แแแแแ, แกแแแแ แแแแแชแแแแแ แแ แแแฎแแแแ แฎแแแแแกแแฌแแแแแ. แแฃ แแ แแชแแกแ แชแแแแแแก แฉแแฌแแ แแก แกแ แฃแ แแแแกแแแแแแ, แแแจแแwrite(2)
แแแแแแแแแแ แแแแแ, แกแแแแ แแ แฌแแแแแแฎแแแ แกแแแแแ แแกแ แแแแแชแแแแแ แแแแกแแแแแแแแ แฉแแฌแแ แแก แจแแกแแกแ แฃแแแแแแ.
POSIX แแแแฎแแแแแก แแกแแแแกแแ, แแก แแแแจแแแแแแแแแ แแแแกแแแแ: แแแแกแแแแแแ แฌแแ แ แแแ PIPE_BUF
แแแแขแ (แแแแแแฃแ 512) แฃแแแ แแงแแก แแขแแแฃแ แ, แ แแแ แแ แแชแแกแแแแ แจแแซแแแ แแ แแแแแแแแแ แแแแฃแแแแแชแแ แแแแกแแแแแแก แแแจแแแแแแ แแกแ, แ แแ แ แแแฃแแแ แฃแแ แคแแแแแแ (แ แแแแแแแช แแ แแซแแแแ แแกแแ แแแ แแแขแแแแก) แแ แจแแฃแซแแแแ.
แฉแแแฃแแแแ แแแ แคแแแแแก แแแแแงแแแแแแกแแก, แแ แแชแแกแก แจแแฃแซแแแ แฉแแฌแแ แแก แแแกแแ แแแแแ แแแแแแแแแแ แแ แแแแแกแชแแก แกแฎแแ แแ แแชแแกแก. แแ แแ แแชแแกแแแก แจแแฃแซแแแแ แแแฃแจแแแ แฃแแฆแ แแกแแ แแแ แแแแแฃแ แ แแแแแจแ, แแแ แ แกแแกแแแแแแ แแแฅแแแแแแแก แแแแแงแแแแแแ (แ แแแแ แช แกแแแแคแแ แ), แ แแแ แแ แแแแแแแก แแชแแแแแ แฉแแฌแแ แแก แแ แฌแแแแแฎแแแก แแแกแ แฃแแแแแกแแก. แแแแแแแแ แแแ แแแแฎแกแแแก แแ แฃแกแแแแแแแแแแกแแแ.
แ แแก แแแซแแแ?
แแ แแแแฎแกแแแ แแแก แแแ แขแแแ แกแแขแงแแแแแ, แ แแแ แแแแแแแแแแแแ แฌแแ แแแแแแแ, แ แแแแ แแฃแจแแแแก แแแแแแแแ แ. แแฅแแแ แฃแแแ แแแแแงแแ แแฃแคแแ แ แแ แแแ แแแแฃแแ แแแแแแแ แแแแ แแแฎแกแแแ แแแแจแ. แแแแญแแ แแแแแ แคแฃแแฅแชแแแแ แแฃแคแแ แแแแ แแแแแชแแแแแแก แแแกแแแแขแแแแแ แแ แแแแกแแฆแแแแ. แแแแญแแ แแแแแ แแแ แแแแฃแแ แกแแจแฃแแแแแแแ แคแฃแแฅแชแแแแแก แแแแแกแแซแแฎแแแแแ แคแแแแแก แแฆแฌแแ แแแแ แฌแแแแแฎแแแกแ แแ แฉแแฌแแ แแก แแแแ แแชแแแแแก แแ แแก. แแ แแแแญแแ แแแแแ แกแแแแขแแแ แแแแแ แแฆแฌแแ แแแ แกแแแชแแแแฃแ แ แฅแชแแแแก แแแแกแแฎแแ แชแแแแแแแแ.
แแฎแแ แฉแแแ แแแแ แแแ แ แแแแแแแแแแฎแแ แแแ แแแแก แฌแงแแ แแก แแแแ แแแแแแ แแแแฃแ แแก แจแฃแฅแแก แฅแแแจ, แ แแแ แแแแแแแกแขแฃแ แแ แแ แฃแแ แแงแแ แฉแแแแ แแฃแแแแแแแ แแแแแแ แแแ แแแแแแ. แแแแ แแ แงแแแแแแแแก แแแแแแแแแ แแแฃแแแแแแแแแแกแแแแก.
แกแแ แแแซแแแ?
แแ แแแชแ แกแแ แแ แแก แชแแแแแแ แฌแแแแแก แฉแแแ แแกแแ "
TUHS-แแก แแ แฅแแแแแจแ แฎแแขแแแแ แแฃแแแฃแแแก แแแแแฎแฃแแแแแก แฐแแแแก. แฉแแแ แจแแแแแซแแแ แแแแแแฎแแแแ แฉแแแแก แกแแแ แแ แแกแขแแ แแแก แแ แแ แแแขแแแก แแชแแ แแ แแแแแฌแแแแ แซแแแแกแฎแแแแแก, แ แแ แแก แแแกแแแ แแขแแแแแ แแแแ แแฆแแแแแแแ แซแแแแ แคแแ แแแแแแ แแ แแแแแแญแแแแแแแ. แแ แแ แแแ แแแ แแแชแ แแ แคแ แแแแแแขแแแแก แจแแกแแฎแแ, แ แแแแแแแช แฏแแ แแแแแ แแแแแ.
แแแแแแแแ แแแแก แฃแซแแแแแกแ แแกแขแแ แแแก แจแแกแแฎแแ แฉแแแแ แชแแแแแกแแแงแแแ แแแแแก แแแแแแงแแคแแแแแแก แจแแแแแ, แจแแแแ แแแแกแแแแก แจแแแแแซแแแ แจแแแฎแแแแ แแแแแแแแ แแแ แแแ แแแแแก.
แกแฎแแแแ แจแแ แแก, pipe
แชแฎแ แแแจแ แแ แแก แกแแกแขแแแฃแ แ แแแ แแก แแแแแ แ 42 sysent[]
. แแแแแฎแแแแ?
แขแ แแแแชแแฃแแ Unix แแแ แแแแแ (1970โ1974)
แแแแแ แแแ แแแแแแ pipe(2)
แแ แช แจแแแแแ
แแแแก แจแแกแแฎแแ TUHS แแชแฎแแแแแก
Unix 1973rd Edition แแงแ แแแแ แแแ แกแแ แแแ แแแแ แแแฌแแ แแแ แแกแแแแแแแก แแแแแ, แแแแ แแ แแกแแแ แแแ แแแแ แแแ แกแแ แแแแกแแแแแแแแ. XNUMX แฌแแแก แฉแแขแแ แแ แแฃแจแแแแ แแแกแแแ แแแแแชแแแแก แแแกแแฃแแฏแแแแกแแแแแ, แแแ แแแ แแแแแแฌแแ แแก C-แแ แแ แแกแ แแแแแฉแแแ Unix-แแก แแแแแฎแ แแแแแชแแแ.
แแ แแแ แแแแแฎแแแแแ แแแแแ แแแแฃแแแแขแแก แกแแแแแ แแแ, แ แแแแแจแแช แแแ แแแแแแ แแแ แจแแกแแแแแแ แแแแ "แแ แแแ แแแแแแก แแแแแแจแแ แแแแก, แ แแแแ แช แแแฆแแก แจแแแแแ".
แแ แแแแ แแแ แแแแแแแก แฌแแแแจแ
แ แแแแกแแช Unix แแแแแแแแ, แฉแแแแ แแแขแแชแแแแ แแแ แฃแขแแแแแแ แแแแแซแแ, แแแฎแแแ OS-แแก แแแขแแ แก, แแแ แขแแแแกแแแก, แแแฃแจแแแก แแ แแชแแกแแ แแแฌแแ แแแ แแแแแชแแแแแ แแแแแกแฃแแแงแ แแ แ แแฎแแแแ แแแฌแงแแแแแแแแจแ, แแ แแแแ แกแฎแแ แแ แแชแแกแแแช. แแแแแ แแแแแฌแงแแแขแ, แ แแ แแก แจแแกแแซแแแแแแ แแงแ. แแฃแแชแ, แ แแแแ แช แแแแแแแแแกแขแก, แแแก แกแฃแ แแ, แ แแ แกแแกแขแแแแก แงแแแแ แคแฃแแฅแชแแแก แแแแจแแแแแแแแแ แ แแแ แแแแแแจแ. แแ แแก แแฃ แแ แ แฃแจแฃแแแแ แแ แแชแแกแแแก แจแแ แแก แฉแแฌแแ แ แแแ แแแแช แแแแ แฃแแแ แแขแแกแแแ แจแฃแแแแแฃแ แคแแแแแ แฉแแฌแแ แแกแแแ แจแแแแ แแแแ? แแฎแแแแ แแแจแแ, แ แแแแกแแช แแ แแแแแแแแ แแแแแ แแขแฃแแ แฌแแแแแแแแแ แแแแแแแแแแ แกแแฎแแแฌแแแแแแ โpipelineโ แแ แแ แแชแแกแแแก แจแแ แแก แฃแ แแแแ แแฅแแแแแแแก แกแแแขแแฅแกแแก แแฆแฌแแ แแแแแแ, แแแแแ แกแแแแแแแ แฌแแแแแซแแฎแ: โแแ แแแแก แแแแแแแแแ!โ
แแ แแแแแแแ. แแ แ แกแแแแแแกแฌแแ แ แกแแฆแแแแก, แแแแแ แจแแชแแแแ แแแ แแแ แแ แญแฃแ แแ, แแแแคแแฅแกแแ แ แ แแแแแแแแ แกแขแแแแแ แขแฃแแ แแ แแแ แแแ, แ แแแ แกแขแแแแแ แขแแแแแฃแแแงแ, แแฃ แ แแแแ แแแแฆแแก แแกแแแ แจแแงแแแแแก (แ แแแแแแช แจแแแซแแแแ แแงแแก แแแแกแแแแแแแแ) แแ แแกแแแ แจแแชแแแแ แคแแแแแแแก แกแแฎแแแแแ. แแแแ แ แแฆแแก, แแแแกแแแแแแแแ แแแแฌแงแแก แซแแแแแ แคแแ แแแ แแแแแงแแแแแ แแแแแแแชแแแแจแ. แแแแ แแก แแแแแก แแแแแแแแ แแแ แแงแแแแแแแแ แขแแฅแกแขแแก แแแแแแแแฃแจแแแแแแแแแแแแ แแ แแแขแแ แจแ แแแแฃแแแแขแแแแก แแแกแแแแแแแแ. แชแแขแ แแแแแแแแแแแ, แแแแแ แจแแชแแแแ แแ แแแแแแแฃแ แ API แแ แกแแแขแแฅแกแ แแแแกแแแแแแแแก แแแแแงแแแแแแก แฃแคแ แ แกแฃแคแแ แแแแแแแชแแแแแ, แ แแแแแแแช แแแก แจแแแแแ แแแแแแงแแแแแแแ.
แกแแแฌแฃแฎแแ แแ, แแแกแแแ แแแแแชแแแแก Unix แแแ แแแแก แกแแฌแงแแกแ แแแแ แแแแแแ แแ. แแ แแแฃแฎแแแแแแ แแแแกแ, แ แแ แฉแแแ แแแแฅแแก แแแ แแแแก แกแแฌแงแแกแ แแแแ แแแฌแแ แแแ C
แฉแแแ แแแแฅแแก แขแแฅแกแขแฃแ แ แแแแฃแแแแขแแชแแ pipe(2)
แแ แแแ แแแแแจแแแแแแแ, แแกแ แ แแ แแฅแแแ แจแแแแซแแแแ แแแแฌแงแแ แแแแฃแแแแขแแชแแแก แซแแแแแ pipe(2)
แแแฌแแ แแแแ แแกแแแแแแแก แแแแแ แแ แแแ แฃแแแแก แแฎแแแแ แแ แแ แคแแแแแก แแฆแฌแแ แก, แแแแ แแ แฃแแแ แฃแแ แฃแแแแแงแแคแก แแแกแแแแแแแ แซแแ แแแแ แคแฃแแฅแชแแแแแ แแแแก:
แกแแกแขแแแฃแ แ แแแ แ แแแแ แฅแแแแก แจแแงแแแแแก/แแแแแกแแแแก แแแฅแแแแแแก, แ แแแแแกแแช แแฌแแแแแ แแแแกแแแแแ. แแแแ แฃแแแแฃแแ แคแแแแแก แแฆแแฌแแ แ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แฌแแแแแฎแแแกแ แแ แฉแแฌแแ แแก แแแแ แแชแแแแแกแแแแก. แ แแแแกแแช แ แแฆแแช แแฌแแ แแแ แแแแกแแแแแจแ, 504 แแแแขแแแแ แแแแแชแแแ แแฃแคแแ แแแแ, แ แแก แจแแแแแแแช แฉแแฌแแ แแก แแ แแชแแกแ แฉแแ แแแแ. แแแแกแแแแแแแแ แฌแแแแแฎแแแกแแก แแฃแคแแ แฃแแ แแแแแชแแแแแ แแแแฆแแแฃแแแ.
แแแแแแแแ แฌแแแก แแแ แแแ แแแแแฌแแ แแแ แแงแ C-แจแ แแ pipe(fildes)
"
แกแแกแขแแแฃแ แ แแแ แ แแแแ แฅแแแแก แจแแงแแแแแก/แแแแแกแแแแก แแแฅแแแแแแก, แ แแแแแกแแช แแฌแแแแแ แแแแกแแแแแ. แแแแ แฃแแแแฃแแ แคแแแแแก แแฆแฌแแ แแแ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แฌแแแแแฎแแแกแ แแ แฉแแฌแแ แแก แแแแ แแชแแแแจแ. แ แแแแกแแช แ แแฆแแช แแฌแแ แแแ แแแแกแแแแแจแ, แแแแแแงแแแแแ r1-แจแ แแแแ แฃแแแแฃแแ แกแแฎแแแฃแ แ (resp. fildes[1]), แแฃแคแแ แแ แแแฃแแแ 4096 แแแแขแ แแแแแชแแแแแแ, แ แแก แจแแแแแแแช แฉแแฌแแ แแก แแ แแชแแกแ แจแแฉแแ แแแฃแแแ. แแแแกแแแแแแแแ แฌแแแแแฎแแแกแแก, r0-แแ แแแแ แฃแแแแฃแแ แกแแฎแแแฃแ แ (resp. fildes[0]) แแฆแแแก แแแแแชแแแแแก.
แแแ แแฃแแแแแ, แ แแ แแแแกแแแแแแก แแแแกแแแฆแแ แแก แจแแแแแ, แแ แ (แแ แแแขแ) แกแแแแแฃแแแแแชแแ แแ แแชแแกแ (แจแแฅแแแแแ แจแแแแแแแ แแแแแซแแฎแแแแ แฉแแแแแแ) แแแแแกแชแแแก แแแแแชแแแแแก แแแแกแแแแแแแแ แแแ แแแแก แแแแแงแแแแแแ แฌแแแแแฎแฃแแ ะธ แแแฌแแ แ.
แแแ แกแก แแฅแแก แกแแแขแแฅแกแ แแแแกแแแแแแแ แแแแแแจแแ แแแฃแแ แแ แแชแแกแแแแก แฎแแแแแแแ แแแกแแแแก แแแแกแแแฆแแ แแกแแแแก.
แฌแแแแแฎแแแก แแแ แแแ แชแแ แแแแ แแแแกแแแแแแแแ (แ แแแแแแช แแ แจแแแชแแแก แแฃแคแแ แฃแ แแแแแชแแแแแก), แ แแแแแกแแช แแฅแแก แแฎแแแแ แแ แแ แแแแ (แฉแแฌแแ แแก แคแแแแแก แงแแแแ แแฆแแฌแแ แ แแแฎแฃแ แฃแแแ) แแแ แฃแแแแก "แคแแแแแก แแแกแแกแ แฃแแก". แแกแแแแก แกแแขแฃแแชแแแจแ แฌแแ แแก แแแฌแแแแแแแ แแแแแ แแ แแแฃแแแ.
แงแแแแแแ แแแ แแฃแแ
Unix-แแก แแแแฅแแกแ แแแแแชแแแ (1975)
แแแแแฌแงแแ Unix แแแแแก แแแแฎแแ
แแ แแแแแ แฌแแแก แแแแแแแแแแแจแ แฌแแแแ แแแแแแ แแงแ แแ แแแแแ แแ แแแแฃแแแแขแ Unix-แแก แแแ แแแแ, แ แแแแแแช แฎแแแแแกแแฌแแแแแ แแงแ Bell Labs-แแก แแแ แแ. แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแแแฅแแกแ แแแแแชแแแแก แแแชแแแแแแ แแแกแฌแแแแแแแแแก แกแแจแฃแแแแแ แแแกแชแ แแแแแแงแแแแแแแแ แแแกแ แกแแฌแงแแกแ แแแแ, แแแจแแแแ แแแแแชแแแแก แแแชแแแแแ แแแแแ แแชแฎแแแแ แแ แจแแกแแซแแแแแแแแก, แแแแขแแ แฌแแแแ แแแแ แชแแแแ แฃแแแแแแ แกแแแแญแแ แแกแแแแแก แกแแฎแแ.
แแฆแแก แจแแแแซแแแแ แจแแแซแแแแ แฌแแแแแก แฎแแแแฎแแแ แแแญแแแ, แ แแแแแก แแแ แแแแแแ แแแแแกแแฎแฃแแแ แกแขแฃแแแแขแแแ แแกแแแก แแแแ แแขแจแ. แแ Warren Toomey-แแก แฌแงแแแแแแ (แ แแแแแแแช แแแแฌแงแ TUHS แแ แแแฅแขแ) แจแแแแซแแแแ แฉแแแแขแแแ แแแ
15 แฌแแแแ แแแขแ แฎแแแก แฌแแ, แแ แแแแ แแคแ แแแชแแแฃแแ แฌแงแแ แแก แแแแแก แแกแแ แแแแแแ, แ แแแแแ แแ แแแแแฌแแแ แฉแแแ แแกแแแก แฎแแ แแกแฎแ แกแฎแแ แแกแแแแแก แฃแชแแแแ แ แแแแแแแแแกแแแ. TUHS แฏแแ แแ แแ แกแแแแแแ แแ แแ แแ แแฅแแแแ แฌแแแแแ แซแแแ แฌแงแแ แแแแแ. แแแแ แแ 1988 แฌแแแก แแ แแแแแแ แซแแแแ 9-แขแ แแแแแแ แแแแขแ, แ แแแแแแช แจแแแชแแแแ แกแแ แแแแ แแ แแกแแก PDP11 แแแแแแฃแขแแ แแแแ. แซแแแแ แแงแ แแแแก แแแแแแแ, แแฃแจแแแแแ แแฃ แแ แ, แแแแ แแ แแงแ แฎแแแฃแฎแแแแแแ /usr/src/ แฎแ, แ แแแแแจแแช แคแแแแแแแก แฃแแแขแแกแแแแก แแฌแแ แ 1979 แฌแแแ, แ แแแแแแช แแแจแแแแช แซแแแแแ แแแแแแงแฃแ แแแแแ. แแก แแงแ แแแจแแแแ แแแแแชแแแ แแ แแแกแ แฌแแ แแแแแฃแแ PWB, แ แแแแ แช แแ แแฏแแ แแแ.
แแ แแแแฆแ แแฆแแแฉแแแ, แ แแแแ แช แกแแคแฃแซแแแแ แแ แฎแแแแ แฉแแแแกแฌแแ แ แฌแงแแ แแแแ แแแแฅแแกแ แแแแแชแแแแจแ. แแแแแแ แแ แแแแ แฃแชแแแแแ แแแ แฉแ, แแแแ แแ แแแแแแ แแแก แแแแแ แ แแแแฅแขแแ แแแ, แแแแแแแแ แแแ += แแแขแแแแก แจแแชแแแ แแแซแแแแแแฃแ =+-แแ. แแแแแแ แแ แ แแ แฃแแ แแแแ แฌแแแจแแแ, แแแแ แแ แแแแแแแแ แแแแแฌแแ แแแ แแงแ, แแแแ แแ แแ แช แแกแ แแแแ แ.
แแ แแฆแแก แฉแแแ แจแแแแแซแแแ แฌแแแแแแแฎแแ แแแแแแ TUHS-แแ แแแแฅแแกแ แแแแแชแแแแก แฌแงแแ แแก แแแแ
แกแฎแแแแ แจแแ แแก, แแ แแ แจแแฎแแแแแ, C-แแแแแก แแแแแแ แ แแแฎแแกแแแแแแแแ แแแ แแแแแแแกแ แแ แ แแฉแแก แแแ แแแแแแแ แแ แแก แแแกแ แแแแแแ. แฎแจแแ แแ แแ แจแแแแซแแแ แแแแแก แฉแแกแแ แแ แชแแแ แ แแแแฅแขแแ แแแแก แแแ แแจแ, แ แแแ แแแแ แแแก แจแแแแ แแแแ แแแฌแ แ แฉแแแแแแแก แแ แแแแก แฉแแแก แกแแแขแแ.
แแแ แแฃแแ
/*
* 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()
.
แแ แแจแ 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
).
แจแแแแแ แฉแแแ แแแแแฌแแแแ inode แกแแชแแแแแ แ แแ แแชแฎแแแแก. แกแแแแ แแแแกแแแแแแก แแ แแแ แแแแ แ แฉแแแ แฆแแ, แแ แแชแฎแแแแ แฃแแแ แแงแแก 2-แแก แขแแแ. แฉแแแ แแแขแแ แแแ แแ แ แแแฃแแก ( rp->f_inode
), แแกแ แ แแ, แแฃ แแ แแชแฎแแแแ 2-แแ แแแแแแแแ, แแก แฃแแแ แแแจแแแแแแก, แ แแ แฌแแแแแฎแแแก แแ แแชแแกแแ แแแฎแฃแ แ แแแแกแแแแแแก แแแแ. แกแฎแแ แกแแขแงแแแแแ แ แแ แแแฅแแแ, แฉแแแ แแชแแแแแแ แฉแแแฌแแ แแ แแแฎแฃแ แฃแ แแแแกแแแแแแ แแ แแก แแ แแก แจแแชแแแแ. แแแ แแแแแ แจแแชแแแแแก แแแแ EPIPE
แแ แกแแแแแแ SIGPIPE
แแแแแฉแแแ Unix-แแก แแแแฅแแกแ แแแแแชแแแแจแ.
แแแแ แแ แแแจแแแแช แแ, แแฃ แแแแแแแแ แ แฆแแแ, แแก แจแแแซแแแแ แกแแแกแ แแงแแก. แแ แจแแแแฎแแแแแจแ, แฉแแแ แแแแแแแกแฃแคแแแแ แกแแแแขแก แแ แแแซแแแแแ แแ แแแแแแ, แ แแ แกแฎแแ แแ แแชแแกแ แฌแแแแแแฎแแแก แแแแกแแแแแแแแ แแ แแแแแแแแกแฃแคแแแแก แแแกแจแ แกแแแแแ แแก แแแแแแก. แแแฆแแแซแแแแก แจแแแแแ แแฃแแ แฃแแแแแแ แกแแฌแงแแกแก, แแกแแ แแแแแแแ แกแแแแขแก แแ แแแฌแงแแแ แฉแแฌแแ แแก แแฎแแ แชแแแแก.
แแฃ แแแแกแแแแแจแ แกแแแแแ แแกแ แแแแแกแฃแคแแแ แแแแแแแ, แแแจแแ แแแกแจแ แแแแแชแแแแแก แแฌแแ แ i_size1
inode (แแฃ แแแแกแแแแแ แชแแ แแแแแ, แแก แจแแแซแแแแ แแงแแก 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
แฉแแแ แจแแแแแซแแแ แแแ แแกแ แแแแแฅแชแแ, แ แแแแ แช แฉแแแฃแแแแ แแแ I/O แคแฃแแฅแชแแแแ, แ แแแแแแแช แแฆแแแแ แคแแแแก, แแแแแแก, แแฃแคแแ แก แแแฎแกแแแ แแแแจแ แแ แแแแแแแ แฌแแกแแแแแฎแแ แแ แฉแแกแแฌแแ แ แแแแขแแแแก แ แแแแแแแแแก.
/*
* Read the file corresponding to
* the inode pointed at by the argument.
* The actual read arguments are found
* in the variables:
* u_base core address for destination
* u_offset byte offset in file
* u_count number of bytes to read
* u_segflg read to kernel/user
*/
readi(aip)
struct inode *aip;
/* โฆ */
/*
* Write the file corresponding to
* the inode pointed at by the argument.
* The actual write arguments are found
* in the variables:
* u_base core address for source
* u_offset byte offset in file
* u_count number of bytes to write
* u_segflg write to kernel/user
*/
writei(aip)
struct inode *aip;
/* โฆ */
แ แแช แจแแแฎแแแ "แแแแกแแ แแแขแแฃแ" แแแแแแ แแแแก, แแแจแแ readp()
ะธ writep()
แแแแแแแแ แแแแแ, แกแแแแ แแ แแแแกแ แฃแแแแแ แกแแแฃแจแแแก แแ แแ แแแแฆแแแแ แจแแแแแก (แแแฃ แแแ แแแแ 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, แแแ แขแแแ 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
แแ แแก แจแแคแฃแแแ แแแแแ แแแแ
Linux 0.01
Linux 0.01 แฌแงแแ แแก แแแแ แจแแแแซแแแแ แแฎแแแแ. แกแแกแฌแแแแ แแฅแแแแ แแแแกแแแแแแแแก แแแแฎแแ แชแแแแแแแก แจแแกแฌแแแแ แแแก fs
/pipe.c
. แแก แแงแแแแแก แแแแแก แแแแกแแแแแแก แฌแแ แแแกแแแแแแแ, แแแแ แแ แแแแแ แแแแกแแแแแ แแแฌแแ แแแแ แแแแแแแแ แแแ C-แจแ. แแฃ แแฅแแแ แแแแแ แแ แแ-6 แแแแแชแแแแก แแแแ, แแฅ แแ แแแแแแ แแ แแแฅแแแแแ. แแกแ แแแแแแงแฃแ แแแ แคแฃแแฅแชแแ 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
แแ แช แแกแ แฃแชแฎแแ แแแแแแงแฃแ แแแ.
แแแแแแแแ แแแ Linux แแแ แแแแแ, FreeBSD, NetBSD, OpenBSD
แกแฌแ แแคแแ แแแแแแ แ แ แแแแแแแแ แแแแแแแแ แแแ แแแ แแแ. แแ แชแแ แ แแแแแแแก แแฆแแ แแฅแแก แแแกแแแก แแแแแ แแแ (แแแกแแแแแ แ แแ แแ แแก). Linux-แก แแฅแแก แกแแแฃแแแ แ แแแแแแแแแขแแชแแ. แแแฃแฎแแแแแแ แแแแกแ, แ แแ แกแแแ แแแแแแแแ แแแ BSD แแแ แแแ แจแแแชแแแก แฏแแ แแแแกแแแแก แแแแ แแแฌแแ แแ แแแแแ แแแคแฃแซแแแแฃแ แแแแแแแแแขแแชแแแก, แฌแแแแแก แแแแแแแแแแแจแ แแกแแแ แซแแแแแ แแแแกแฎแแแแแแแแแ แแ แแแแแแแแกแแแ.
แฒฌแแแแแฎแแ fs
/pipe.c
(Linux-แแ) แแ sys
/kern
/sys_pipe.c
(*BSD-แแ), แแแแก แแแแแแแแ แแแแแแแแแ แกแญแแ แแแแ. แแฆแแแแแแแแ แแแแ แแฎแแแ แจแแกแ แฃแแแแแก แแ แแกแแแ แคแฃแแฅแชแแแแแก แแฎแแ แแแญแแ แแก, แ แแแแ แแชแแ แแแฅแขแแ แฃแแ แแ แแกแแแฅแ แแแฃแแ I/O. แแ แแแฎแกแแแ แแแแก แแแแแฌแแแแแแก, แแแแแแ แแแแก แแ แแแ แแแแก แแแแคแแแฃแ แแชแแแก แแแขแแแแแ แซแแแแแ แแแแกแฎแแแแแแแ. แแก แแ แแ แแก แแก, แ แแช แแแแแฏแแแก แกแญแแ แแแแแ แแแแ แแชแแฃแแ แกแแกแขแแแแแแก แจแแกแแแแแ แแฃแ แกแแกแแแแก.
แงแแแแ แจแแแแฎแแแแแจแ, แแ แแแแแขแแ แแกแแแแ แซแแแแ แจแแแแแแแแแก แแแแฎแ แ (แ แแแแ แแชแแ แแแแแ แแ แแแ SIGPIPE
แแ แแแแ แฃแแแ EPIPE
แแแฎแฃแ แฃแ แแแแกแแแแแแ แฉแแฌแแ แแกแแก) แงแแแแ แแ แกแฎแแแแแกแฎแแ แแแแแแแแ แแแ แแแ แแแจแ. แแ แแแแแ แแแ แแกแแ แแก แแแฎแแแแ PDP-11 แแแแแแฃแขแแ แก แ แแแแฃแ แชแฎแแแ แแแแจแ, แแแแ แแ แฏแแ แแแแแ แแแแ แ แ แแ แแ แแก แกแแกแฌแแแแ แแแแแแแ, แ แแแแแแช แแแแฌแแ แ แฉแแแก แแแแแแแแแแแ แฌแแแแแ แแแ แ.
แแแแ แแแแฃแ แแก แแแแ 2011 แฌแแแก แแแฌแแ แแแ แกแขแแขแแ:
แฌแงแแ แ: www.habr.com