ื›ื™ืฆื“ ืžื™ื™ืฉืžื™ื ืฆื™ื ื•ืจื•ืช ื‘-Unix

ื›ื™ืฆื“ ืžื™ื™ืฉืžื™ื ืฆื™ื ื•ืจื•ืช ื‘-Unix
ืžืืžืจ ื–ื” ืžืชืืจ ืืช ื”ื™ื™ืฉื•ื ืฉืœ ืฆื™ื ื•ืจื•ืช ื‘ืœื™ื‘ืช ื™ื•ื ื™ืงืก. ืงืฆืช ื”ืชืื›ื–ื‘ืชื™ ืžื›ืš ืฉืžืืžืจ ืœืื—ืจื•ื ื” ืฉื›ื•ืชืจืชื• "ื›ื™ืฆื“ ืคื•ืขืœื™ื ืฆื™ื ื•ืจื•ืช ื‘-Unix?"ื”ืชื‘ืจืจ ืœื ืœื’ื‘ื™ ื”ืžื‘ื ื” ื”ืคื ื™ืžื™. ื ื”ื™ื™ืชื™ ืกืงืจืŸ ื•ื—ืคืจืชื™ ื‘ืžืงื•ืจื•ืช ื™ืฉื ื™ื ื›ื“ื™ ืœืžืฆื•ื ืืช ื”ืชืฉื•ื‘ื”.

ืขืœ ืžื” ื–ื”?

ืฆื™ื ื•ืจื•ืช, "ื›ื ืจืื” ื”ื”ืžืฆืื” ื”ื—ืฉื•ื‘ื” ื‘ื™ื•ืชืจ ื‘ื™ื•ื ื™ืงืก", ื”ื ืžืืคื™ื™ืŸ ืžื›ืจื™ืข ืฉืœ ืคื™ืœื•ืกื•ืคื™ื™ืช ื™ื•ื ื™ืงืก ื”ื‘ืกื™ืกื™ืช ืฉืœ ืงื™ืฉื•ืจ ืชื•ื›ื ื™ื•ืช ืงื˜ื ื•ืช ื™ื—ื“, ื›ืžื• ื’ื ืกื™ืžืŸ ืžื•ื›ืจ ื‘ืฉื•ืจืช ื”ืคืงื•ื“ื”:

$ echo hello | wc -c
6

ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื–ื• ืชืœื•ื™ื” ื‘ืงืจื™ืื” ืœืžืขืจื›ืช ื”ืžืกื•ืคืงืช ื”ืœื™ื‘ื” pipe, ื”ืžืชื•ืืจ ื‘ื“ืคื™ ื”ืชื™ืขื•ื“ ืฆื™ื ื•ืจ (7) ะธ ืฆื™ื ื•ืจ (2):

ืฆื™ื ื•ืจื•ืช ืžืกืคืงื™ื ืขืจื•ืฅ ื—ื“-ื›ื™ื•ื•ื ื™ ืœืชืงืฉื•ืจืช ื‘ื™ืŸ-ืชื”ืœื™ื›ื™ืช. ืœืฆื™ื ื•ืจ ื™ืฉ ืงืœื˜ (ืกื•ืฃ ื›ืชื™ื‘ื”) ื•ืคืœื˜ (ืงืฆื” ืงืจื™ืื”). ื ื™ืชืŸ ืœืงืจื•ื ื ืชื•ื ื™ื ืฉื ื›ืชื‘ื• ืœื›ื ื™ืกืช ื”ืฆื™ื ื•ืจ ื‘ืžื•ืฆื.

ื”ืฆื™ื ื•ืจ ื ื•ืฆืจ ื‘ืืžืฆืขื•ืช ื”ืงืจื™ืื” pipe(2), ื”ืžื—ื–ื™ืจ ืฉื ื™ ืžืชืืจื™ ืงื‘ืฆื™ื: ื”ืื—ื“ ืžืชื™ื™ื—ืก ืœืงืœื˜ ืฉืœ ื”ืฆื™ื ื•ืจ, ื”ืฉื ื™ ืœืคืœื˜.

ืคืœื˜ ื”ืขืงื‘ื•ืช ืžื”ืคืงื•ื“ื” ืœืขื™ืœ ืžืฆื™ื’ ืืช ื™ืฆื™ืจืช ื”ืฆื™ื ื•ืจ ื•ืืช ื–ืจื™ืžืช ื”ื ืชื•ื ื™ื ื“ืจื›ื• ืžืชื”ืœื™ืš ืื—ื“ ืœืžืฉื ื”ื•:

$ strace -qf -e execve,pipe,dup2,read,write 
    sh -c 'echo hello | wc -c'

execve("/bin/sh", ["sh", "-c", "echo hello | wc -c"], โ€ฆ)
pipe([3, 4])                            = 0
[pid 2604795] dup2(4, 1)                = 1
[pid 2604795] write(1, "hellon", 6)    = 6
[pid 2604796] dup2(3, 0)                = 0
[pid 2604796] execve("/usr/bin/wc", ["wc", "-c"], โ€ฆ)
[pid 2604796] read(0, "hellon", 16384) = 6
[pid 2604796] write(1, "6n", 2)        = 2

ืชื”ืœื™ืš ื”ื”ื•ืจื” ืงื•ืจื pipe()ื›ื“ื™ ืœืงื‘ืœ ืžืชืืจื™ ืงื‘ืฆื™ื ืจื›ื•ื‘ื™ื. ืชื”ืœื™ืš ืฆืืฆื ืื—ื“ ื›ื•ืชื‘ ืœื™ื“ื™ืช ืื—ืช, ื•ืชื”ืœื™ืš ืื—ืจ ืงื•ืจื ืืช ืื•ืชื ื ืชื•ื ื™ื ืžื ืงื•ื“ืช ืื—ื™ื–ื” ืื—ืจืช. ื”ืžืขื˜ืคืช ืžืฉืชืžืฉืช ื‘-dup2 ื›ื“ื™ "ืœืฉื ื•ืช ืฉื" ืœืชื™ืื•ืจื™ื 3 ื•-4 ื›ื“ื™ ืœื”ืชืื™ื ืœ-stdin ื•-stdout.

ืœืœื ืฆื™ื ื•ืจื•ืช, ื”ืžืขื˜ืคืช ืชืฆื˜ืจืš ืœื›ืชื•ื‘ ืืช ื”ืชื•ืฆืื” ืฉืœ ืชื”ืœื™ืš ืื—ื“ ืœืงื•ื‘ืฅ ื•ืœื”ืขื‘ื™ืจ ืื•ืชื” ืœืชื”ืœื™ืš ืื—ืจ ื›ื“ื™ ืœืงืจื•ื ืืช ื”ื ืชื•ื ื™ื ืžื”ืงื•ื‘ืฅ. ื›ืชื•ืฆืื” ืžื›ืš, ื ื‘ื–ื‘ื– ื™ื•ืชืจ ืžืฉืื‘ื™ื ื•ืฉื˜ื— ื“ื™ืกืง. ืขื ื–ืืช, ืฆื™ื ื•ืจื•ืช ื˜ื•ื‘ื™ื ืœื ืจืง ื‘ื’ืœืœ ืฉื”ื ืžืืคืฉืจื™ื ืœืš ืœื”ื™ืžื ืข ืžืฉื™ืžื•ืฉ ื‘ืงื‘ืฆื™ื ื–ืžื ื™ื™ื:

ืื ืชื”ืœื™ืš ืžื ืกื” ืœืงืจื•ื ืžืฆื™ื ื•ืจ ืจื™ืง ืื– read(2) ื™ื—ืกื•ื ืขื“ ืฉื”ื ืชื•ื ื™ื ื™ื”ื™ื• ื–ืžื™ื ื™ื. ืื ืชื”ืœื™ืš ืžื ืกื” ืœื›ืชื•ื‘ ืœืฆื™ื ื•ืจ ืžืœื, ืื– write(2) ื™ื—ืกื•ื ืขื“ ืฉื ืงืจื ืžืกืคื™ืง ื ืชื•ื ื™ื ืžื”ืฆื™ื ื•ืจ ื›ื“ื™ ืœื‘ืฆืข ืืช ื”ื›ืชื™ื‘ื”.

ื›ืžื• ื“ืจื™ืฉืช POSIX, ื–ื”ื• ืžืืคื™ื™ืŸ ื—ืฉื•ื‘: ื›ืชื™ื‘ื” ืœืฆื™ื ื•ืจ ืขื“ PIPE_BUF ื‘ืชื™ื (ืœืคื—ื•ืช 512) ื—ื™ื™ื‘ื™ื ืœื”ื™ื•ืช ืื˜ื•ืžื™ื™ื ื›ื“ื™ ืฉืชื”ืœื™ื›ื™ื ื™ื•ื›ืœื• ืœืชืงืฉืจ ื–ื” ืขื ื–ื” ื“ืจืš ื”ืฆื™ื ื•ืจ ื‘ืื•ืคืŸ ืฉืงื‘ืฆื™ื ืจื’ื™ืœื™ื (ืฉืื™ื ื ืžืกืคืงื™ื ืขืจื‘ื•ื™ื•ืช ื›ืืœื”) ืœื ื™ื›ื•ืœื™ื.

ื›ืืฉืจ ืžืฉืชืžืฉื™ื ื‘ืงื•ื‘ืฅ ืจื’ื™ืœ, ืชื”ืœื™ืš ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืืœื™ื• ืืช ื›ืœ ื”ืคืœื˜ ืฉืœื• ื•ืœื”ืขื‘ื™ืจ ืื•ืชื• ืœืชื”ืœื™ืš ืื—ืจ. ืื• ืชื”ืœื™ื›ื™ื ื™ื›ื•ืœื™ื ืœืคืขื•ืœ ื‘ืžืฆื‘ ืžืงื‘ื™ืœ ื‘ื™ื•ืชืจ, ืชื•ืš ืฉื™ืžื•ืฉ ื‘ืžื ื’ื ื•ืŸ ืื™ืชื•ืช ื—ื™ืฆื•ื ื™ (ื›ืžื• ืกืžืคื•ืจ) ื›ื“ื™ ืœื”ื•ื“ื™ืข โ€‹โ€‹ื–ื” ืœื–ื” ื›ืืฉืจ ื›ืชื™ื‘ื” ืื• ืงืจื™ืื” ื”ื•ืฉืœืžื”. ืžืกื•ืขื™ื ื—ื•ืกื›ื™ื ืื•ืชื ื• ืžื›ืœ ื”ื˜ืจื—ื” ื”ื–ื•.

ืžื” ืื ื—ื ื• ืžื—ืคืฉื™ื?

ืื ื™ ืืกื‘ื™ืจ ืืช ื–ื” ื‘ืžื™ืœื™ื ืคืฉื•ื˜ื•ืช ื›ื“ื™ ืฉื™ื”ื™ื” ืœืš ืงืœ ื™ื•ืชืจ ืœื“ืžื™ื™ืŸ ืื™ืš ืžืกื•ืข ื™ื›ื•ืœ ืœืขื‘ื•ื“. ืชืฆื˜ืจืš ืœื”ืงืฆื•ืช ื—ื•ืฆืฅ ื•ืžืฆื‘ ื›ืœืฉื”ื• ื‘ื–ื™ื›ืจื•ืŸ. ืชื–ื“ืงืง ืœืคื•ื ืงืฆื™ื•ืช ื›ื“ื™ ืœื”ื•ืกื™ืฃ ื•ืœื”ืกื™ืจ ื ืชื•ื ื™ื ืžื”ืžืื’ืจ. ืชื–ื“ืงืง ืœืืžืฆืขื™ื ืžืกื•ื™ืžื™ื ื›ื“ื™ ืœืงืจื•ื ืœืคื•ื ืงืฆื™ื•ืช ื‘ืžื”ืœืš ืคืขื•ืœื•ืช ืงืจื™ืื” ื•ื›ืชื™ื‘ื” ืขืœ ืžืชืืจื™ ืงื‘ืฆื™ื. ื•ืืชื” ืชืฆื˜ืจืš ืžื ืขื•ืœื™ื ื›ื“ื™ ืœื™ื™ืฉื ืืช ื”ื”ืชื ื”ื’ื•ืช ื”ืžื™ื•ื—ื“ืช ืฉืชื•ืืจื” ืœืขื™ืœ.

ื›ืขืช ืื ื• ืžื•ื›ื ื™ื ืœื—ืงื•ืจ ืืช ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ืœื™ื‘ื” ืชื—ืช ืื•ืจ ืžื ื•ืจื” ื‘ื”ื™ืจ ื›ื“ื™ ืœืืฉืจ ืื• ืœื”ืคืจื™ืš ืืช ื”ืžื•ื“ืœ ื”ืžื ื˜ืœื™ ื”ืžืขื•ืจืคืœ ืฉืœื ื•. ืื‘ืœ ืชืžื™ื“ ื”ื™ื• ืžื•ื›ื ื™ื ืœื‘ืœืชื™ ืฆืคื•ื™.

ืื™ืคื” ืื ื—ื ื• ืžื—ืคืฉื™ื?

ืื ื™ ืœื ื™ื•ื“ืข ืื™ืคื” ื”ืขื•ืชืง ืฉืœื™ ืฉืœ ื”ืกืคืจ ื”ืžืคื•ืจืกื "ืกืคืจ ืืจื™ื•ืช"ืขื ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ Unix 6, ืื‘ืœ ื‘ื–ื›ื•ืช ื”ื—ื‘ืจื” ืœืžื•ืจืฉืช ื™ื•ื ื™ืงืก ืืชื” ื™ื›ื•ืœ ืœื—ืคืฉ ื‘ืื™ื ื˜ืจื ื˜ ื‘ ืงื•ื“ ืžืงื•ืจ ืืคื™ืœื• ื’ืจืกืื•ืช ื™ืฉื ื•ืช ื™ื•ืชืจ ืฉืœ ื™ื•ื ื™ืงืก.

ืฉื™ื˜ื•ื˜ ื‘ืืจื›ื™ื•ืŸ TUHS ื”ื•ื ื›ืžื• ื‘ื™ืงื•ืจ ื‘ืžื•ื–ื™ืื•ืŸ. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืกืชื›ืœ ืขืœ ื”ื”ื™ืกื˜ื•ืจื™ื” ื”ืžืฉื•ืชืคืช ืฉืœื ื•, ื•ื™ืฉ ืœื™ ื›ื‘ื•ื“ ืœืžืืžืฅ ืจื‘ ื”ืฉื ื™ื ืœืฉื—ื–ืจ ืืช ื›ืœ ื”ื—ื•ืžืจ ื”ื–ื” ื˜ื™ืคื™ืŸ ื˜ื™ืคื™ืŸ ืžืงืœื˜ื•ืช ื•ื”ื“ืคืกื™ื ื™ืฉื ื™ื. ื•ืื ื™ ืžื•ื“ืข ื”ื™ื˜ื‘ ืœืื•ืชื ืฉื‘ืจื™ื ืฉืขื“ื™ื™ืŸ ื—ืกืจื™ื.

ืœืื—ืจ ืฉืกื™ืคืงื ื• ืืช ืกืงืจื ื•ืชื ื• ืœื’ื‘ื™ ื”ื”ื™ืกื˜ื•ืจื™ื” ื”ืขืชื™ืงื” ืฉืœ ืžืกื•ืขื™ื, ื ื•ื›ืœ ืœื”ืกืชื›ืœ ืขืœ ื’ืจืขื™ื ื™ื ืžื•ื“ืจื ื™ื™ื ืœืฉื ื”ืฉื•ื•ืื”.

ืื’ื‘, pipe ื”ื•ื ืฉื™ื—ืช ืžืขืจื›ืช ืžืกืคืจ 42 ื‘ื˜ื‘ืœื” sysent[]. ื™ึธื“ ื”ึทืžึดืงืจึถื”?

ื’ืจืขื™ื ื™ ื™ื•ื ื™ืงืก ืžืกื•ืจืชื™ื™ื (1970โ€“1974)

ืœื ืžืฆืืชื™ ืขืงื‘ื•ืช pipe(2) ื’ื ืœื ื‘ PDP-7 Unix (ื™ื ื•ืืจ 1970), ื•ืœื ื‘ ืžื”ื“ื•ืจื” ืจืืฉื•ื ื” ืฉืœ ื™ื•ื ื™ืงืก (ื ื•ื‘ืžื‘ืจ 1971), ื•ื’ื ืœื ื‘ืงื•ื“ ื”ืžืงื•ืจ ื”ืœื ืฉืœื ืžื”ื“ื•ืจื” ืฉื ื™ื™ื” (ื™ื•ื ื™ 1972).

TUHS ืงื•ื‘ืข ื–ืืช ืžื”ื“ื•ืจื” ืฉืœื™ืฉื™ืช ืฉืœ ื™ื•ื ื™ืงืก (ืคื‘ืจื•ืืจ 1973) ื”ืคื›ื” ืœื’ืจืกื” ื”ืจืืฉื•ื ื” ืขื ืžืกื•ืขื™ื:

Unix 1973rd Edition ื”ื™ื™ืชื” ื”ื’ืจืกื” ื”ืื—ืจื•ื ื” ืขื ืœื™ื‘ื” ืฉื ื›ืชื‘ื” ื‘ืฉืคืช assembly, ืื‘ืœ ื’ื ื”ื’ืจืกื” ื”ืจืืฉื•ื ื” ืขื pipelines. ื‘ืžื”ืœืš XNUMX ื‘ื•ืฆืขื” ืขื‘ื•ื“ื” ืœืฉื™ืคื•ืจ ื”ืžื”ื“ื•ืจื” ื”ืฉืœื™ืฉื™ืช, ื”ืงืจื ืœ ืฉื•ื›ืชื‘ ื‘-C, ื•ื›ืš ื”ื•ืคื™ืขื” ื”ืžื”ื“ื•ืจื” ื”ืจื‘ื™ืขื™ืช ืฉืœ ื™ื•ื ื™ืงืก.

ืื—ื“ ื”ืงื•ืจืื™ื ืžืฆื ืกืจื™ืงื” ืฉืœ ืžืกืžืš ืฉื‘ื• ื”ืฆื™ืข ื“ืื’ ืžืงื™ืœืจื•ื™ ืืช ื”ืจืขื™ื•ืŸ ืฉืœ "ื—ื™ื‘ื•ืจ ืชื•ื›ื ื™ื•ืช ื›ืžื• ืฆื™ื ื•ืจ ื’ื™ื ื”".

ื›ื™ืฆื“ ืžื™ื™ืฉืžื™ื ืฆื™ื ื•ืจื•ืช ื‘-Unix
ื‘ืกืคืจื• ืฉืœ ื‘ืจื™ืืŸ ืงืจื ื™ื’ืืŸื™ื•ื ื™ืงืก: ื”ื™ืกื˜ื•ืจื™ื” ื•ื–ื›ืจื•ืŸ"ื‘ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื”ื•ืคืขืชื ืฉืœ ืžืกื•ืขื™ื, ืžื•ื–ื›ืจ ื’ื ื”ืžืกืžืš ื”ื–ื”: "... ื”ื•ื ื”ื™ื” ืชืœื•ื™ ืขืœ ื”ืงื™ืจ ื‘ืžืฉืจื“ ืฉืœื™ ื‘-Bell Labs ื‘ืžืฉืš 30 ืฉื ื”." ื›ืืŸ ืจืื™ื•ืŸ ืขื ืžืงื™ืœืจื•ื™, ื•ืขื•ื“ ืกื™ืคื•ืจ ืž ืขื‘ื•ื“ืชื• ืฉืœ ืžืงื™ืœืจื•ื™, ืฉื ื›ืชื‘ื” ื‘-2014:

ื›ืฉื™ื•ื ื™ืงืก ื™ืฆื, ื”ืงืกื ืฉืœื™ ืžื”ืงื•ืจื•ื˜ื™ื ื™ื ื”ื•ื‘ื™ืœ ืื•ืชื™ ืœื‘ืงืฉ ืžืžื—ื‘ืจ ืžืขืจื›ืช ื”ื”ืคืขืœื”, ืงืŸ ืชื•ืžืคืกื•ืŸ, ืœืืคืฉืจ ืœื ืชื•ื ื™ื ืฉื ื›ืชื‘ื• ืœืชื”ืœื™ืš ืœืขื‘ื•ืจ ืœื ืจืง ืœืžื›ืฉื™ืจ, ืืœื ื’ื ืœืฆืืช ืœืชื”ืœื™ืš ืื—ืจ. ืงืŸ ื”ื—ืœื™ื˜ ืฉื–ื” ืืคืฉืจื™. ืขื ื–ืืช, ื›ืžื™ื ื™ืžืœื™ืกื˜, ื”ื•ื ืจืฆื” ืฉื›ืœ ืคื•ื ืงืฆื™ื™ืช ืžืขืจื›ืช ืชืžืœื ืชืคืงื™ื“ ืžืฉืžืขื•ืชื™. ื”ืื ื›ืชื™ื‘ื” ื™ืฉื™ืจื” ื‘ื™ืŸ ืชื”ืœื™ื›ื™ื ื”ื™ื ื‘ืืžืช ื™ืชืจื•ืŸ ื’ื“ื•ืœ ืขืœ ืคื ื™ ื›ืชื™ื‘ื” ืœืงื•ื‘ืฅ ื‘ื™ื ื™ื™ื? ืจืง ื›ืฉื”ืฆืขืชื™ ื”ืฆืขื” ืกืคืฆื™ืคื™ืช ืขื ื”ืฉื ื”ืงืœื™ื˜ "ืฆื™ื ื•ืจ" ื•ืชื™ืื•ืจ ื”ืชื—ื‘ื™ืจ ืœืื™ื ื˜ืจืืงืฆื™ื” ื‘ื™ืŸ ืชื”ืœื™ื›ื™ื, ืงืŸ ืœื‘ืกื•ืฃ ืงืจื: "ืื ื™ ืืขืฉื” ืืช ื–ื”!"

ื•ืขืฉื”. ืขืจื‘ ื’ื•ืจืœื™ ืื—ื“, ืงืŸ ืฉื™ื ื” ืืช ื”ื’ืจืขื™ืŸ ื•ื”ืงืœื™ืคื”, ืชื™ืงืŸ ื›ืžื” ืชื•ื›ื ื™ื•ืช ืกื˜ื ื“ืจื˜ื™ื•ืช ื›ื“ื™ ืœืชืงืŸ ืืช ื”ืื•ืคืŸ ืฉื‘ื• ื”ื ืžืงื‘ืœื™ื ืงืœื˜ (ืฉื™ื›ื•ืœ ืœื”ื’ื™ืข ืžืฆื™ื ื•ืจ), ื•ื’ื ืฉื™ื ื” ืฉืžื•ืช ืงื‘ืฆื™ื. ืœืžื—ืจืช ื”ื—ืœื• ืœื”ืฉืชืžืฉ ื‘ืฆื™ื ื•ืจื•ืช ื‘ืื•ืคืŸ ื ืจื—ื‘ ื‘ื™ื™ืฉื•ืžื™ื. ืขื“ ืกื•ืฃ ื”ืฉื‘ื•ืข, ืžื–ื›ื™ืจื•ืช ื”ืฉืชืžืฉื• ื‘ื”ืŸ ื›ื“ื™ ืœืฉืœื•ื— ืžืกืžื›ื™ื ืžืžืขื‘ื“ื™ ืชืžืœื™ืœื™ื ืœืžื“ืคืกืช. ืงืฆืช ืžืื•ื—ืจ ื™ื•ืชืจ, ืงืŸ ื”ื—ืœื™ืฃ ืืช ื”-API ื”ืžืงื•ืจื™ ื•ืืช ื”ืชื—ื‘ื™ืจ ืœืขื˜ื™ืคืช ื”ืฉื™ืžื•ืฉ ื‘ืฆื™ื ื•ืจื•ืช ืขื ืžื•ืกื›ืžื•ืช ื ืงื™ื•ืช ื™ื•ืชืจ, ืฉื”ื™ื• ื‘ืฉื™ืžื•ืฉ ืžืื–.

ืœืจื•ืข ื”ืžื–ืœ, ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ืœื™ื‘ืช ื”ืžื”ื“ื•ืจื” ื”ืฉืœื™ืฉื™ืช ืฉืœ ื™ื•ื ื™ืงืก ืื‘ื“. ื•ืœืžืจื•ืช ืฉื™ืฉ ืœื ื• ืืช ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ืœื™ื‘ื” ื›ืชื•ื‘ ื‘-C ื’ืจืกื ืจื‘ื™ืขื™ืช, ืฉื•ื—ืจืจ ื‘ื ื•ื‘ืžื‘ืจ 1973, ืืš ื”ื•ื ื™ืฆื ืžืกืคืจ ื—ื•ื“ืฉื™ื ืœืคื ื™ ื”ืฉื—ืจื•ืจ ื”ืจืฉืžื™ ื•ืื™ื ื• ืžื›ื™ืœ ื™ื™ืฉื•ืžื™ ืฆื™ื ื•ืจ. ื—ื‘ืœ ืฉืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ืคื•ื ืงืฆื™ื™ืช ื™ื•ื ื™ืงืก ื”ืื’ื“ื™ืช ื”ื–ื• ืื‘ื“, ืื•ืœื™ ืœื ืฆื—.

ื™ืฉ ืœื ื• ืชื™ืขื•ื“ ื˜ืงืกื˜ ืขื‘ื•ืจ pipe(2) ืžืฉืชื™ ื”ื’ืจืกืื•ืช, ื›ืš ืฉืชื•ื›ืœ ืœื”ืชื—ื™ืœ ื‘ื—ื™ืคื•ืฉ ื‘ืชื™ืขื•ื“ ืžื”ื“ื•ืจื” ืฉืœื™ืฉื™ืช (ืขื‘ื•ืจ ืžื™ืœื™ื ืžืกื•ื™ืžื•ืช, ืงื• ืชื—ืชื•ืŸ "ื™ื“ื ื™ืช", ืžื—ืจื•ื–ืช ืžื™ืœื•ืœื™ืช ^H, ื•ืื—ืจื™ื” ืงื• ืชื—ืชื•ืŸ!). ื”ืคืจื•ื˜ื• ื”ื–ื”-pipe(2) ื›ืชื•ื‘ ื‘ืฉืคืช assembly ื•ืžื—ื–ื™ืจ ืจืง ืžืชืืจ ืงื•ื‘ืฅ ืื—ื“, ืื‘ืœ ื›ื‘ืจ ืžืกืคืง ืืช ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ืœื™ื‘ื” ื”ืฆืคื•ื™ื”:

ืฉื™ื—ืช ืžืขืจื›ืช ืžืงื˜ืจืช ื™ื•ืฆืจ ืžื ื’ื ื•ืŸ ืงืœื˜/ืคืœื˜ ื”ื ืงืจื ืฆื™ื ื•ืจ. ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืžืชืืจ ื”ืงื•ื‘ืฅ ื”ืžื•ื—ื–ืจ ืขื‘ื•ืจ ืคืขื•ืœื•ืช ืงืจื™ืื” ื•ื›ืชื™ื‘ื”. ื›ืืฉืจ ืžืฉื”ื• ื ื›ืชื‘ ืœืฆื™ื ื•ืจ, ืขื“ 504 ื‘ืชื™ื ืฉืœ ื ืชื•ื ื™ื ืžืื•ื—ืกื ื™ื, ื•ืœืื—ืจ ืžื›ืŸ ืชื”ืœื™ืš ื”ื›ืชื™ื‘ื” ืžื•ืฉืขื”. ื‘ืขืช ืงืจื™ืื” ืžื”ืฆื™ื ื•ืจ, ื”ื ืชื•ื ื™ื ื”ืžืื•ื—ืกื ื™ื ื ืœืงื—ื™ื ืžืฉื.

ื‘ืฉื ื” ืฉืœืื—ืจ ืžื›ืŸ ื”ื’ืจืขื™ืŸ ื ื›ืชื‘ ืžื—ื“ืฉ ื‘-C, ื• pipe(2) ื‘ืžื”ื“ื•ืจื” ื”ืจื‘ื™ืขื™ืช ืจื›ืฉ ืืช ื”ืžืจืื” ื”ืžื•ื“ืจื ื™ ืฉืœื• ืขื ืื‘ ื”ื˜ื™ืคื•ืก"pipe(fildes)ยป:

ืฉื™ื—ืช ืžืขืจื›ืช ืžืงื˜ืจืช ื™ื•ืฆืจ ืžื ื’ื ื•ืŸ ืงืœื˜/ืคืœื˜ ื”ื ืงืจื ืฆื™ื ื•ืจ. ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืชื™ืื•ืจื™ ื”ืงื•ื‘ืฅ ื”ืžื•ื—ื–ืจื™ื ื‘ืคืขื•ืœื•ืช ืงืจื™ืื” ื•ื›ืชื™ื‘ื”. ื›ืืฉืจ ืžืฉื”ื• ื ื›ืชื‘ ืœืฆื™ื ื•ืจ, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘-handle ื”ืžื•ื—ื–ืจืช ื‘-r1 (ื‘ื”ืชืืžื” fildes[1]), ืžืื’ืจืช ืœ-4096 ื‘ืชื™ื ืฉืœ ื ืชื•ื ื™ื, ื•ืœืื—ืจ ืžื›ืŸ ืชื”ืœื™ืš ื”ื›ืชื™ื‘ื” ืžื•ืฉืขื”. ื‘ืขืช ืงืจื™ืื” ืžื”ืฆื™ื ื•ืจ, ื”ื™ื“ื™ืช ื”ืžื•ื—ื–ืจืช ืœ-r0 (ื‘ื”ืชืืžื” fildes[0]) ืœื•ืงื—ืช ืืช ื”ื ืชื•ื ื™ื.

ื”ื”ื ื—ื” ื”ื™ื ืฉื‘ืจื’ืข ื”ื’ื“ืจืช ืฆื™ื ื•ืจ, ืฉื ื™ ืชื”ืœื™ื›ื™ ืชืงืฉื•ืจืช (ืื• ื™ื•ืชืจ) (ื”ื ื•ืฆืจื™ื ืขืœ ื™ื“ื™ ืงืจื™ืื•ืช ืขื•ืงื‘ื•ืช ืืœ ืžื–ืœื’) ื™ืขื‘ื™ืจ ื ืชื•ื ื™ื ืžื”ืฆื™ื ื•ืจ ื‘ืืžืฆืขื•ืช ืฉื™ื—ื•ืช ืœืงืจื•ื ะธ ืœื›ืชื•ื‘.

ืœืžืขื˜ืคืช ื™ืฉ ืชื—ื‘ื™ืจ ืœื”ื’ื“ืจืช ืžืขืจืš ืœื™ื ื™ืืจื™ ืฉืœ ืชื”ืœื™ื›ื™ื ื”ืžื—ื•ื‘ืจื™ื ื‘ืฆื™ื ื•ืจ.

ืงืจื™ืื•ืช ืœืงืจื™ืื” ืžืฆื™ื ื•ืจ ืจื™ืง (ืฉืื™ื ื• ืžื›ื™ืœ ื ืชื•ื ื™ื ืžืื•ื’ืจื™ื) ืฉื™ืฉ ืœื• ืจืง ืงืฆื” ืื—ื“ (ื›ืœ ืžืชืืจื™ ื”ื›ืชื™ื‘ื” ืกื’ื•ืจื™ื) ืžื—ื–ื™ืจื•ืช "ืกื•ืฃ ืงื•ื‘ืฅ". ืงืจื™ืื•ืช ืœื›ืชื•ื‘ ื‘ืžืฆื‘ ื“ื•ืžื” ื–ื•ื›ื•ืช ืœื”ืชืขืœืžื•ืช.

ื”ื›ื™ ืžื•ืงื“ื ื™ื™ืฉื•ื ืฆื™ื ื•ืจ ืžืฉื•ืžืจ ื—ืœ ืœืžื”ื“ื•ืจื” ื”ื—ืžื™ืฉื™ืช ืฉืœ ื™ื•ื ื™ืงืก (ื™ื•ื ื™ 1974), ืื‘ืœ ื–ื” ื›ืžืขื˜ ื–ื”ื” ืœื–ื” ืฉื”ื•ืคื™ืข ื‘ืžื”ื“ื•ืจื” ื”ื‘ืื”. ื–ื” ืขืชื” ื ื•ืกืคื• ื”ืขืจื•ืช, ื›ืš ืฉืชื•ื›ืœ ืœื“ืœื’ ืขืœ ื”ืžื”ื“ื•ืจื” ื”ื—ืžื™ืฉื™ืช.

ื”ืžื”ื“ื•ืจื” ื”ืฉื™ืฉื™ืช ืฉืœ ื™ื•ื ื™ืงืก (1975)

ื‘ื•ืื• ื ืชื—ื™ืœ ืœืงืจื•ื ืืช ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื™ื•ื ื™ืงืก ืžื”ื“ื•ืจื” ืฉื™ืฉื™ืช (ืžืื™ 1975). ื‘ืขื™ืงืจ ื‘ื–ื›ื•ืช ืืจื™ื•ืช ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ืœืžืฆื•ื ืื•ืชื• ืžืืฉืจ ื”ืžืงื•ืจื•ืช ืฉืœ ื’ืจืกืื•ืช ืงื•ื“ืžื•ืช:

ื‘ืžืฉืš ืฉื ื™ื ืจื‘ื•ืช ื”ืกืคืจ ืืจื™ื•ืช ื”ื™ื” ื”ืžืกืžืš ื”ื™ื—ื™ื“ ืขืœ ืœื™ื‘ืช ื™ื•ื ื™ืงืก ื”ื–ืžื™ืŸ ืžื—ื•ืฅ ืœืžืขื‘ื“ื•ืช ื‘ืœ. ืœืžืจื•ืช ืฉืจื™ืฉื™ื•ืŸ ื”ืžื”ื“ื•ืจื” ื”ืฉื™ืฉื™ืช ืืคืฉืจ ืœืžื•ืจื™ื ืœื”ืฉืชืžืฉ ื‘ืงื•ื“ ื”ืžืงื•ืจ ืฉืœื•, ืจื™ืฉื™ื•ืŸ ื”ืžื”ื“ื•ืจื” ื”ืฉื‘ื™ืขื™ืช ืฉืœืœ ืืคืฉืจื•ืช ื–ื•, ื•ืœื›ืŸ ื”ืกืคืจ ื”ื•ืคืฅ ื‘ืฆื•ืจื” ืฉืœ ืขื•ืชืงื™ื ืžื•ื“ืคืกื™ื ืœื ื—ื•ืงื™ื™ื.

ื›ื™ื•ื ื ื™ืชืŸ ืœืจื›ื•ืฉ ื”ื“ืคืกื” ืžื—ื•ื“ืฉืช ืฉืœ ื”ืกืคืจ, ืฉืขืœ ื”ื›ืจื™ื›ื” ืฉืœื• ื ืจืื™ื ืชืœืžื™ื“ื™ื ื‘ืžื›ื•ื ืช ืฆื™ืœื•ื. ื•ื‘ื–ื›ื•ืช Warren Toomey (ืฉื”ืชื—ื™ืœ ืืช ืคืจื•ื™ืงื˜ TUHS) ืืชื” ื™ื›ื•ืœ ืœื”ื•ืจื™ื“ ืงื•ื‘ืฅ PDF ืขื ืงื•ื“ ืžืงื•ืจ ืœืžื”ื“ื•ืจื” ื”ืฉื™ืฉื™ืช. ืื ื™ ืจื•ืฆื” ืœืชืช ืœืš ืžื•ืฉื’ ื›ืžื” ืžืืžืฅ ื”ื•ืฉืงืข ื‘ื™ืฆื™ืจืช ื”ืงื•ื‘ืฅ:

ืœืคื ื™ ื™ื•ืชืจ ืž-15 ืฉื ื”, ื”ืงืœื“ืชื™ ืขื•ืชืง ืฉืœ ืงื•ื“ ื”ืžืงื•ืจ ื”ืžื•ืคื™ืข ื‘ ืืจื™ื•ืช, ื›ื™ ืœื ืื”ื‘ืชื™ ืืช ื”ืื™ื›ื•ืช ืฉืœ ื”ืขื•ืชืง ืฉืœื™ ืžืžืกืคืจ ืœื ื™ื“ื•ืข ืฉืœ ืขื•ืชืงื™ื ืื—ืจื™ื. TUHS ืœื ื”ื™ื” ืงื™ื™ื ืขื“ื™ื™ืŸ ื•ืœื ื”ื™ื™ืชื” ืœื™ ื’ื™ืฉื” ืœืžืงื•ืจื•ืช ื”ื™ืฉื ื™ื. ืื‘ืœ ื‘ืฉื ืช 1988, ืžืฆืืชื™ ืงืœื˜ืช ื™ืฉื ื” ื‘ืช 9 ืจืฆื•ืขื•ืช ืฉื”ื›ื™ืœื” ื’ื™ื‘ื•ื™ ืžืžื—ืฉื‘ PDP11. ื”ื™ื” ืงืฉื” ืœื“ืขืช ืื ื–ื” ืขื•ื‘ื“, ืื‘ืœ ื”ื™ื” ืขืฅ /usr/src/ ืฉืœื ืฉื‘ื• ืจื•ื‘ ื”ืงื‘ืฆื™ื ืกื•ืžื ื• ืขื ืฉื ืช 1979, ืฉื›ื‘ืจ ืื– ื ืจืืชื” ืขืชื™ืงื”. ื–ื• ื”ื™ื™ืชื” ื”ืžื”ื“ื•ืจื” ื”ืฉื‘ื™ืขื™ืช ืื• ื”ื ื’ื–ืจืช ืฉืœื” PWB, ื›ืคื™ ืฉื”ืืžื ืชื™.

ืœืงื—ืชื™ ืืช ื”ืžืžืฆื ื›ื‘ืกื™ืก ื•ืขืจื›ืชื™ ื™ื“ื ื™ืช ืืช ื”ืžืงื•ืจื•ืช ืœืžื”ื“ื•ืจื” ื”ืฉื™ืฉื™ืช. ื—ืœืง ืžื”ืงื•ื“ ื ืฉืืจ ื–ื”ื”, ืื‘ืœ ื—ืœืง ื”ื™ื” ืฆืจื™ืš ืœืขืจื•ืš ืžืขื˜, ืฉื™ื ื•ื™ ื”ืืกื™ืžื•ืŸ ื”ืžื•ื“ืจื ื™ += ืœ-=+ ื”ืžื™ื•ืฉืŸ. ื—ืœืง ืžื”ื“ื‘ืจื™ื ืคืฉื•ื˜ ื ืžื—ืงื•, ื•ื—ืœืง ื”ื™ื” ืฆืจื™ืš ืœืฉื›ืชื‘ ืœื’ืžืจื™, ืื‘ืœ ืœื ื™ื•ืชืจ ืžื“ื™.

ื•ื”ื™ื•ื ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœืงืจื•ื ื‘ืื™ื ื˜ืจื ื˜ ื‘-TUHS ืืช ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ืžื”ื“ื•ืจื” ื”ืฉื™ืฉื™ืช ืž ืืจื›ื™ื•ืŸ, ืฉืืœื™ื• ื”ื™ื™ืชื” ื™ื“ ืœื“ื ื™ืก ืจื™ืฆ'ื™.

ืื’ื‘, ื‘ืžื‘ื˜ ืจืืฉื•ืŸ, ื”ืžืืคื™ื™ืŸ ื”ืขื™ืงืจื™ ืฉืœ ืงื•ื“ ื”-C ืœืคื ื™ ื”ืชืงื•ืคื” ืฉืœ ืงืจื ื™ื’ืืŸ ื•ืจื™ืฆ'ื™ ื”ื•ื ืฉืœื• ืงื•ึนืฆึถืจ. ืœื ืœืขืชื™ื ืงืจื•ื‘ื•ืช ืื ื™ ืžืฆืœื™ื— ืœื”ื›ื ื™ืก ืคื™ืกื•ืช ืงื•ื“ ืœืœื ืขืจื™ื›ื” ืžืงื™ืคื” ื›ื“ื™ ืœื”ืชืื™ื ืœืื–ื•ืจ ืชืฆื•ื’ื” ืฆืจ ื™ื—ืกื™ืช ื‘ืืชืจ ืฉืœื™.

ื‘ื”ืชื—ืœื” /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;
}

ื”ืชื’ื•ื‘ื” ืžืชืืจืช โ€‹โ€‹ื‘ื‘ื™ืจื•ืจ ืžื” ืงื•ืจื” ื›ืืŸ. ืื‘ืœ ื”ื‘ื ืช ื”ืงื•ื“ ืœื ื›ืœ ื›ืš ืงืœื”, ื‘ื™ืŸ ื”ื™ืชืจ ื‘ื’ืœืœ ื”ื“ืจืš"struct user uยป ื•ื ืจืฉื R0 ะธ R1 ืคืจืžื˜ืจื™ ืงืจื™ืืช ืžืขืจื›ืช ื•ืขืจื›ื™ ื”ื—ื–ืจื” ืžื•ืขื‘ืจื™ื.

ื‘ื•ืื• ื ื ืกื” ืขื ialloc() ืœืฉื™ื ืขืœ ื“ื™ืกืง inode (ื™ื“ื™ืช ืื™ื ื“ืงืก)ื•ืขืœ ื™ื“ื™ falloc() - ื”ืฆื‘ ืฉื ื™ื™ื ื‘ื–ื™ื›ืจื•ืŸ ั„ะฐะนะปะฐ. ืื ื”ื›ืœ ื™ืœืš ื›ืฉื•ืจื”, ื ื’ื“ื™ืจ ื“ื’ืœื™ื ืœื–ื”ื•ืช ืืช ื”ืงื‘ืฆื™ื ื”ืืœื” ื›ืฉื ื™ ืงืฆื•ื•ืช ืฉืœ ื”ืฆื™ื ื•ืจ, ื ื›ื•ื•ืŸ ืื•ืชื ืœืื•ืชื• ื”ืื™ื ื•ื“ (ืฉืกืคื™ืจืช ื”ื”ืชื™ื™ื—ืกื•ืช ืฉืœื• ืชื•ื’ื“ืจ ืœ-2), ื•ื ืกืžืŸ ืืช ื”ืื™ื ื•ื“ ื›ืฉื•ื ื” ื•ื‘ืฉื™ืžื•ืฉ. ืฉื™ืžื• ืœื‘ ืœื‘ืงืฉื•ืช ืœ ืื ื™ ืฉื() ื‘ื ืชื™ื‘ื™ ืฉื’ื™ืื” ื›ื“ื™ ืœื”ืคื—ื™ืช ืืช ืกืคื™ืจืช ื”ืคื ื™ื•ืช ื‘ืื™ื ื•ื“ ื”ื—ื“ืฉ.

pipe() ื—ื™ื™ื‘ ืœืขื‘ื•ืจ R0 ะธ R1 ื”ื—ื–ืจ ืžืกืคืจื™ ืžืชืืจ ืงื‘ืฆื™ื ืœืงืจื™ืื” ื•ื›ืชื™ื‘ื”. falloc() ืžื—ื–ื™ืจ ืžืฆื‘ื™ืข ืœืžื‘ื ื” ื”ืงื•ื‘ืฅ, ืืš ื’ื "ืžื—ื–ื™ืจ" ื‘ืืžืฆืขื•ืช u.u_ar0[R0] ื•ืžืชืืจ ืงื•ื‘ืฅ. ื›ืœื•ืžืจ, ื”ืงื•ื“ ืฉื•ืžืจ ืคื ื™ืžื” r ืžืชืืจ ืงื•ื‘ืฅ ืœืงืจื™ืื” ื•ืžืงืฆื” ืžืชืืจ ืงื•ื‘ืฅ ืœื›ืชื™ื‘ื” ื™ืฉื™ืจื•ืช ืžืžื ื• u.u_ar0[R0] ืœืื—ืจ ื”ืฉื™ื—ื” ื”ืฉื ื™ื™ื” falloc().

ื“ื’ืœ FPIPE, ืื•ืชื• ืื ื• ืžื’ื“ื™ืจื™ื ื‘ืขืช ื™ืฆื™ืจืช ื”ืฆื™ื ื•ืจ, ืฉื•ืœื˜ ื‘ื”ืชื ื”ื’ื•ืช ื”ืคื•ื ืงืฆื™ื” rdwr() ื‘-sys2.cืงืจื™ืื” ืœืฉื’ืจื•ืช ืงืœื˜/ืคืœื˜ ืกืคืฆื™ืคื™ื•ืช:

/*
 * 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 ื”ื•ืคื™ืข ื‘ืžื”ื“ื•ืจื” ื”ืฉื™ืฉื™ืช ืฉืœ ื™ื•ื ื™ืงืก.

ืื‘ืœ ื’ื ืื ื”ืžืกื•ืข ืคืชื•ื—, ื”ื•ื ืขืฉื•ื™ ืœื”ื™ื•ืช ืžืœื. ื‘ืžืงืจื” ื–ื”, ืื ื• ืžืฉื—ืจืจื™ื ืืช ื”ืžื ืขื•ืœ ื•ื”ื•ืœื›ื™ื ืœื™ืฉื•ืŸ ื‘ืชืงื•ื•ื” ืฉืชื”ืœื™ืš ื ื•ืกืฃ ื™ืงืจื ืžื”ืฆื™ื ื•ืจ ื•ื™ืคื ื” ื‘ื• ืžืกืคื™ืง ืžืงื•ื. ืœืื—ืจ ืฉื”ืชืขื•ืจืจื ื•, ืื ื• ื—ื•ื–ืจื™ื ืœื”ืชื—ืœื”, ืžื ืชืงื™ื ืฉื•ื‘ ืืช ื”ืžื ืขื•ืœ ื•ืžืชื—ื™ืœื™ื ืžื—ื–ื•ืจ ื”ืงืœื˜ื” ื—ื“ืฉ.

ืื ื™ืฉ ืžืกืคื™ืง ืžืงื•ื ืคื ื•ื™ ื‘ืฆื ืจืช, ืื ื• ื›ื•ืชื‘ื™ื ืœื• ื ืชื•ื ื™ื ื‘ืืžืฆืขื•ืช writei()... ืคึผึธืจึธืžึถื˜ึถืจ i_size1 inode (ืื ื”ืฆื™ื ื•ืจ ืจื™ืง, ื”ื•ื ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื•ื•ื” ืœ-0) ืžืฆื™ื™ืŸ ืืช ืกื•ืฃ ื”ื ืชื•ื ื™ื ืฉื”ื•ื ื›ื‘ืจ ืžื›ื™ืœ. ืื ื™ืฉ ืžืกืคื™ืง ืฉื˜ื— ื”ืงืœื˜ื”, ื ื•ื›ืœ ืœืžืœื ืืช ื”ืฆื™ื ื•ืจ ืžืžื ื• i_size1 ะดะพ PIPESIZ. ืœืื—ืจ ืžื›ืŸ ืื ื• ืžืฉื—ืจืจื™ื ืืช ื”ืžื ืขื•ืœ ื•ืžื ืกื™ื ืœื”ืขื™ืจ ื›ืœ ืชื”ืœื™ืš ืฉืžื—ื›ื” ืœืงืจื•ื ืžื”ืฆื™ื ื•ืจ. ืื ื—ื ื• ื—ื•ื–ืจื™ื ืœื”ืชื—ืœื” ื›ื“ื™ ืœืจืื•ืช ืื ื”ืฆืœื—ื ื• ืœื›ืชื•ื‘ ื›ืžื” ื‘ืชื™ื ืฉื”ื™ื™ื ื• ืฆืจื™ื›ื™ื. ืื ื–ื” ื ื›ืฉืœ, ืื– ืื ื—ื ื• ืžืชื—ื™ืœื™ื ืžื—ื–ื•ืจ ื”ืงืœื˜ื” ื—ื“ืฉ.

ื‘ื“ืจืš ื›ืœืœ ื”ืคืจืžื˜ืจ i_mode inode ืžืฉืžืฉ ืœืื—ืกื•ืŸ ื”ืจืฉืื•ืช r, w ะธ x. ืื‘ืœ ื‘ืžืงืจื” ืฉืœ ืฆื™ื ื•ืจื•ืช, ืื ื• ืžืกืžื ื™ื ืฉืชื”ืœื™ืš ื›ืœืฉื”ื• ืžืžืชื™ืŸ ืœื›ืชื™ื‘ื” ืื• ืงืจื™ืื” ื‘ืืžืฆืขื•ืช ื‘ื™ื˜ื™ื IREAD ะธ IWRITE ื‘ื”ืชืืžื”. ื”ืชื”ืœื™ืš ืงื•ื‘ืข ืืช ื”ื“ื’ืœ ื•ืžืชืงืฉืจ sleep(), ื•ืฆืคื•ื™ ืฉืชื”ืœื™ืš ืื—ืจ ื›ืœืฉื”ื• ื‘ืขืชื™ื“ ื™ื’ืจื•ื wakeup().

ื”ืงืกื ื”ืืžื™ืชื™ ืžืชืจื—ืฉ ื‘ sleep() ะธ wakeup(). ื”ื ืžื™ื•ืฉืžื™ื ื‘ slp.c, ืžืงื•ืจ ื”ื”ืขืจื” ื”ืžืคื•ืจืกืžืช "ืœื ืžืฆืคื™ื ืžืžืš ืœื”ื‘ื™ืŸ ืืช ื–ื”". ืœืžืจื‘ื” ื”ืžื–ืœ, ืื ื—ื ื• ืœื ืฆืจื™ื›ื™ื ืœื”ื‘ื™ืŸ ืืช ื”ืงื•ื“, ืจืง ืขื™ื™ืŸ ื‘ื›ืžื” ื”ืขืจื•ืช:

/*
 * Give up the processor till a wakeup occurs
 * on chan, at which time the process
 * enters the scheduling queue at priority pri.
 * The most important effect of pri is that when
 * pri<0 a signal cannot disturb the sleep;
 * if pri>=0 signals will be processed.
 * Callers of this routine must be prepared for
 * premature return, and check that the reason for
 * sleeping has gone away.
 */
sleep(chan, pri) /* โ€ฆ */

/*
 * Wake up all processes sleeping on chan.
 */
wakeup(chan) /* โ€ฆ */

ื”ืชื”ืœื™ืš ืฉื’ื•ืจื sleep() ืขื‘ื•ืจ ืขืจื•ืฅ ืžืกื•ื™ื, ืขืœื•ืœ ืœื”ืชืขื•ืจืจ ืžืื•ื—ืจ ื™ื•ืชืจ ืขืœ ื™ื“ื™ ืชื”ืœื™ืš ืื—ืจ, ืฉื™ื’ืจื•ื wakeup() ืขื‘ื•ืจ ืื•ืชื• ืขืจื•ืฅ. writep() ะธ readp() ืœืชืื ืืช ืคืขื•ืœื•ืชื™ื”ื ื‘ืืžืฆืขื•ืช ืฉื™ื—ื•ืช ื–ื•ื’ื™ื•ืช ื›ืืœื”. ืฆื™ื™ืŸ ื–ืืช pipe.c ืชืžื™ื“ ื ื•ืชืŸ ืขื“ื™ืคื•ืช PPIPE ื›ืฉืงื•ืจืื™ื ืœื• sleep(), ืื– ื–ื”ื• ื–ื” sleep() ืขืœื•ืœ ืœื”ื™ืงื˜ืข ืขืœ ื™ื“ื™ ืื•ืช.

ืขื›ืฉื™ื• ื™ืฉ ืœื ื• ื”ื›ืœ ื›ื“ื™ ืœื”ื‘ื™ืŸ ืืช ื”ืคื•ื ืงืฆื™ื” readp():

readp(fp)
int *fp;
{
    register *rp, *ip;

    rp = fp;
    ip = rp->f_inode;

loop:
    /* Very conservative locking. */

    plock(ip);

    /*
     * If the head (read) has caught up with
     * the tail (write), reset both to 0.
     */

    if(rp->f_offset[1] == ip->i_size1) {
        if(rp->f_offset[1] != 0) {
            rp->f_offset[1] = 0;
            ip->i_size1 = 0;
            if(ip->i_mode&IWRITE) {
                ip->i_mode =& ~IWRITE;
                wakeup(ip+1);
            }
        }

        /*
         * If there are not both reader and
         * writer active, return without
         * satisfying read.
         */

        prele(ip);
        if(ip->i_count < 2)
            return;
        ip->i_mode =| IREAD;
        sleep(ip+2, PPIPE);
        goto loop;
    }

    /* Read and return */

    u.u_offset[0] = 0;
    u.u_offset[1] = rp->f_offset[1];
    readi(ip);
    rp->f_offset[1] = u.u_offset[1];
    prele(ip);
}

ื™ื™ืชื›ืŸ ืฉื™ื”ื™ื” ืœืš ืงืœ ื™ื•ืชืจ ืœืงืจื•ื ืืช ื”ืคื•ื ืงืฆื™ื” ื”ื–ื• ืžืœืžื˜ื” ืœืžืขืœื”. ื”ืขื ืฃ "ืงืจื ื•ื”ื—ื–ืจ" ืžืฉืžืฉ ื‘ื“ืจืš ื›ืœืœ ื›ืืฉืจ ื™ืฉ ื ืชื•ื ื™ื ืžืกื•ื™ืžื™ื ื‘ืฆื ืจืช. ื‘ืžืงืจื” ื–ื”, ืื ื• ืžืฉืชืžืฉื™ื readi() ืื ื• ืงื•ืจืื™ื ื ืชื•ื ื™ื ืจื‘ื™ื ื›ื›ืœ ื”ืืคืฉืจื™ื™ื ื”ื—ืœ ืžื”ื ืชื•ื ื™ื ื”ื ื•ื›ื—ื™ื™ื f_offset ืงืจื™ืื”, ื•ืœืื—ืจ ืžื›ืŸ ืขื“ื›ืŸ ืืช ื”ืขืจืš ืฉืœ ื”ื”ื™ืกื˜ ื”ืžืชืื™ื.

ื‘ืงืจื™ืื•ืช ืขื•ืงื‘ื•ืช, ื”ืฆื™ื ื•ืจ ื™ื”ื™ื” ืจื™ืง ืื ื”ื™ืกื˜ ื”ืงืจื™ืื” ื”ื’ื™ืข i_size1 ื‘-inode. ืื ื• ืžืืคืกื™ื ืืช ื”ืžื™ืงื•ื ืœ-0 ื•ืžื ืกื™ื ืœื”ืขื™ืจ ื›ืœ ืชื”ืœื™ืš ืฉืจื•ืฆื” ืœื›ืชื•ื‘ ืœืฆื™ื ื•ืจ. ืื ื—ื ื• ื™ื•ื“ืขื™ื ืฉื›ืฉื”ืžืกื•ืข ืžืœื, writep() ื™ื™ืจื“ื ืขืœ ip+1. ื•ืขื›ืฉื™ื• ื›ืฉื”ืฆื™ื ื•ืจ ืจื™ืง, ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื”ืขื™ืจ ืื•ืชื• ื›ื“ื™ ืœื—ื“ืฉ ืืช ืžื—ื–ื•ืจ ื”ื›ืชื™ื‘ื” ืฉืœื•.

ืื ืื™ืŸ ืœืš ืžื” ืœืงืจื•ื, ืื– readp() ื™ื›ื•ืœ ืœื”ื’ื“ื™ืจ ื“ื’ืœ IREAD ื•ืœื”ื™ืจื“ื ืขืœ ip+2. ืื ื—ื ื• ื™ื•ื“ืขื™ื ืžื” ื™ืขื™ืจ ืื•ืชื• writep(), ื›ืืฉืจ ื”ื•ื ื›ื•ืชื‘ ื ืชื•ื ื™ื ืžืกื•ื™ืžื™ื ืœืฆื™ื ื•ืจ.

ืชื’ื•ื‘ื•ืช ืขืœ readi() ื•-writeri() ื™ืขื–ื•ืจ ืœืš ืœื”ื‘ื™ืŸ ืฉื‘ืžืงื•ื ืœื”ืขื‘ื™ืจ ืคืจืžื˜ืจื™ื ื‘ืืžืฆืขื•ืช "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() ืžื—ื“ืฉ ืืช ื”ืžื—ื–ื•ืจ.

ื‘ื›ืš ื”ื•ืฉืœื ืชื™ืื•ืจ ื”ืžืกื•ืขื™ื ื‘ืžื”ื“ื•ืจื” ื”ืฉื™ืฉื™ืช. ืงื•ื“ ืคืฉื•ื˜, ื”ืฉืœื›ื•ืช ืžืจื—ื™ืงื•ืช ืœื›ืช.

ืžื”ื“ื•ืจื” ืฉื‘ื™ืขื™ืช ืฉืœ ื™ื•ื ื™ืงืก (ื™ื ื•ืืจ 1979) ื”ื™ื™ืชื” ืžื”ื“ื•ืจื” ื’ื“ื•ืœื” ื—ื“ืฉื” (ืืจื‘ืข ืฉื ื™ื ืžืื•ื—ืจ ื™ื•ืชืจ) ืฉื”ืฆื™ื’ื” ื™ื™ืฉื•ืžื™ื ื—ื“ืฉื™ื ื•ืชื›ื•ื ื•ืช ืœื™ื‘ื” ืจื‘ื•ืช. ื›ืžื• ื›ืŸ, ื”ื•ื ืขื‘ืจ ืฉื™ื ื•ื™ื™ื ืžืฉืžืขื•ืชื™ื™ื ื‘ืงืฉืจ ืขื ื”ืฉื™ืžื•ืฉ ื‘ื™ืฆื™ืงืช ืกื•ื’, ืื™ื’ื•ื“ื™ื ื•ืžืฆื‘ื™ืขื™ื ืžื•ื“ืคืกื™ื ืœืžื‘ื ื™ื. ืœืžืจื•ืช ื–ืืช ืงื•ื“ ืžืกื•ืข ื›ืžืขื˜ ืœืœื ืฉื™ื ื•ื™. ืื ื—ื ื• ื™ื›ื•ืœื™ื ืœื“ืœื’ ืขืœ ื”ืžื”ื“ื•ืจื” ื”ื–ื•.

Xv6, ื’ืจืขื™ืŸ ืคืฉื•ื˜ ื“ืžื•ื™ ื™ื•ื ื™ืงืก

ื›ื“ื™ ืœื™ืฆื•ืจ ืืช ื”ืงืจื ืœ Xv6 ืžื•ืฉืคืข ืžื”ืžื”ื“ื•ืจื” ื”ืฉื™ืฉื™ืช ืฉืœ Unix, ืืš ื”ื™ื ื›ืชื•ื‘ื” ื‘-C ื”ืžื•ื“ืจื ื™ืช ื›ื“ื™ ืœืคืขื•ืœ ืขืœ ืžืขื‘ื“ื™ x86. ื”ืงื•ื“ ืงืœ ืœืงืจื™ืื” ื•ืžื•ื‘ืŸ. ื‘ื ื•ืกืฃ, ื‘ื ื™ื’ื•ื“ ืœืžืงื•ืจื•ืช ื™ื•ื ื™ืงืก ืขื 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. ืื ื™ ืžืžืœื™ืฅ ืœืงืจื•ื ืืช ื›ืœ ื”ืงื•ื“ ืฉืœื•. ื”ืžื•ืจื›ื‘ื•ืช ื”ื™ื ื‘ืจืžืช ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ืžื”ื“ื•ืจื” ื”ืฉื™ืฉื™ืช, ืื‘ืœ ื”ืจื‘ื” ื™ื•ืชืจ ืงืœ ื•ืžื”ื ื” ืœืงืจื™ืื”.

ืœื™ื ื•ืงืก 0.01

ื ื™ืชืŸ ืœืžืฆื•ื ืืช ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ Linux 0.01. ื–ื” ื™ื”ื™ื” ืžืืœืฃ ืœืœืžื•ื“ ืืช ื™ื™ืฉื•ื ืฆื™ื ื•ืจื•ืช ืฉืœื• fs/pipe.c. ื–ื” ืžืฉืชืžืฉ ื‘ืื™ื ื•ื“ ื›ื“ื™ ืœื™ื™ืฆื’ ืืช ื”ืฆื™ื ื•ืจ, ืื‘ืœ ื”ืฆื™ื ื•ืจ ืขืฆืžื• ื›ืชื•ื‘ ื‘-C ื”ืžื•ื“ืจื ื™ืช. ืื ืขื‘ืจืช ืืช ื“ืจื›ืš ื‘ืงื•ื“ ืžื”ื“ื•ืจื” 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;
}

ืืคื™ืœื• ืžื‘ืœื™ ืœื”ืกืชื›ืœ ืขืœ ื”ื’ื“ืจื•ืช ื”ืžื‘ื ื”, ืืชื” ื™ื›ื•ืœ ืœื”ื‘ื™ืŸ ื›ื™ืฆื“ ืžืฉืชืžืฉื™ื ื‘ืกืคื™ืจืช ื”ืคื ื™ื•ืช ื”ืื™ื ื•ื“ ื›ื“ื™ ืœื‘ื“ื•ืง ืื ืคืขื•ืœืช ื›ืชื™ื‘ื” ืžื‘ื™ืื” SIGPIPE. ื‘ื ื•ืกืฃ ืœืขื‘ื•ื“ื” ื‘ื™ื™ื˜ ืื—ืจ ื‘ื™ื™ื˜, ืงืœ ืœื”ืฉื•ื•ืช ืคื•ื ืงืฆื™ื” ื–ื• ืขื ื”ืจืขื™ื•ื ื•ืช ืฉืชื•ืืจื• ืœืขื™ืœ. ืืคื™ืœื• ื”ื™ื’ื™ื•ืŸ sleep_on/wake_up ืœื ื ืจืื” ื›ืœ ื›ืš ื–ืจ.

ืœื™ื‘ื•ืช ืœื™ื ื•ืงืก ืžื•ื“ืจื ื™ื•ืช, FreeBSD, NetBSD, OpenBSD

ืจืฆืชื™ ื‘ืžื”ื™ืจื•ืช ื›ืžื” ื’ืจืขื™ื ื™ื ืžื•ื“ืจื ื™ื™ื. ืœืืฃ ืื—ื“ ืžื”ื ื›ื‘ืจ ืื™ืŸ ืžื™ืžื•ืฉ ื“ื™ืกืง (ืœื ืžืคืชื™ืข). ืœืœื™ื ื•ืงืก ื™ืฉ ื™ื™ืฉื•ื ืžืฉืœื”. ืœืžืจื•ืช ืฉืฉืœื•ืฉืช ืœื™ื‘ื•ืช ื”-BSD ื”ืžื•ื“ืจื ื™ื•ืช ืžื›ื™ืœื•ืช ื™ื™ืฉื•ืžื™ื ื”ืžื‘ื•ืกืกื™ื ืขืœ ืงื•ื“ ืฉื ื›ืชื‘ ืขืœ ื™ื“ื™ ื’'ื•ืŸ ื“ื™ื™ืกื•ืŸ, ืขื ื”ืฉื ื™ื ื”ื ื”ืคื›ื• ืฉื•ื ื™ื ืžื“ื™ ื–ื” ืžื–ื”.

ืœืงืจื•ื fs/pipe.c (ื‘ืœื™ื ื•ืงืก) ืื• sys/kern/sys_pipe.c (ื‘-*BSD), ื–ื” ื“ื•ืจืฉ ื”ืชืžืกืจื•ืช ืืžื™ืชื™ืช. ื”ืงื•ื“ ืฉืœ ื”ื™ื•ื ืขื•ืกืง ื‘ื‘ื™ืฆื•ืขื™ื ื•ืชืžื™ื›ื” ื‘ืชื›ื•ื ื•ืช ื›ืžื• ื•ืงื˜ื•ืจ ื•-I/O ืืกื™ื ื›ืจื•ื ื™. ื•ื”ืคืจื˜ื™ื ืฉืœ ื”ืงืฆืืช ื–ื™ื›ืจื•ืŸ, ืžื ืขื•ืœื™ื ื•ืชืฆื•ืจืช ื”ืœื™ื‘ื” ื›ื•ืœื ืžืฉืชื ื™ื ืžืื•ื“. ื–ื” ืœื ืžื” ืฉืžื›ืœืœื•ืช ืฆืจื™ื›ื•ืช ืœืงื•ืจืก ืžื‘ื•ื ืœืžืขืจื›ื•ืช ื”ืคืขืœื”.

ื‘ื›ืœ ืžืงืจื”, ื”ื™ื™ืชื™ ืžืขื•ื ื™ื™ืŸ ืœื—ืคื•ืจ ื›ืžื” ื“ืคื•ืกื™ื ื™ืฉื ื™ื (ื›ืžื• ื™ืฆื™ืจื” SIGPIPE ื•ืชื—ื–ื•ืจ EPIPE ื›ืืฉืจ ื›ื•ืชื‘ื™ื ืœืฆื™ื ื•ืจ ืกื’ื•ืจ) ื‘ื›ืœ ื”ื’ืจืขื™ื ื™ื ื”ืžื•ื“ืจื ื™ื™ื ื”ืฉื•ื ื™ื ื”ืœืœื•. ื›ื ืจืื” ืฉืœืขื•ืœื ืœื ืืจืื” ืžื—ืฉื‘ PDP-11 ื‘ื—ื™ื™ื ื”ืืžื™ืชื™ื™ื, ืื‘ืœ ืขื“ื™ื™ืŸ ื™ืฉ ื”ืจื‘ื” ืžื” ืœืœืžื•ื“ ืžืงื•ื“ ืฉื ื›ืชื‘ ืฉื ื™ื ืœืคื ื™ ืฉื ื•ืœื“ืชื™.

ืžืืžืจ ืฉื ื›ืชื‘ ืขืœ ื™ื“ื™ ื“ื™ื•ื•ื™ ืงืืคื•ืจ ื‘-2011:ื™ื™ืฉื•ื ืœื™ื‘ืช ืœื™ื ื•ืงืก ืฉืœ ืฆื™ื ื•ืจื•ืช ื•-FIFOs" ืžืกืคืง ืกืงื™ืจื” ื›ืœืœื™ืช ืฉืœ ื”ืื•ืคืŸ ืฉื‘ื• ืฆื™ื ื•ืจื•ืช (ืขื“ื™ื™ืŸ) ืขื•ื‘ื“ื™ื ื‘ืœื™ื ื•ืงืก. ื ื”ืชื—ื™ื™ื‘ื•ืช ืœืื—ืจื•ื ื” ื‘ืœื™ื ื•ืงืก ืžืžื—ื™ืฉ ืžื•ื“ืœ ืฆื™ื ื•ืจ ืฉืœ ืื™ื ื˜ืจืืงืฆื™ื”, ืฉื”ื™ื›ื•ืœื•ืช ืฉืœื• ืขื•ืœื•ืช ืขืœ ืืœื• ืฉืœ ืงื‘ืฆื™ื ื–ืžื ื™ื™ื; ื•ื’ื ืžืจืื” ืขื“ ื›ืžื” ืฆื™ื ื•ืจื•ืช ื”ื’ื™ืขื• ืž"ื”ื ืขื™ืœื” ื”ืฉืžืจื ื™ืช ืžืื•ื“" ืฉืœ ืœื™ื‘ืช ื”ืžื”ื“ื•ืจื” ื”ืฉื™ืฉื™ืช ืฉืœ ื™ื•ื ื™ืงืก.

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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”