เจฏเฉ‚เจจเจฟเจ•เจธ เจตเจฟเฉฑเจš เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ

เจฏเฉ‚เจจเจฟเจ•เจธ เจตเจฟเฉฑเจš เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ
เจ‡เจน เจฒเฉ‡เจ– เจฏเฉ‚เจจเจฟเจ•เจธ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจฎเฉˆเจ‚ เจฅเฉ‹เฉœเจพ เจจเจฟเจฐเจพเจธเจผ เจธเฉ€ เจ•เจฟ เจ‡เฉฑเจ• เจคเจพเจœเจผเจพ เจฒเฉ‡เจ– เจœเจฟเจธเจฆเจพ เจธเจฟเจฐเจฒเฉ‡เจ– เจนเฉˆ "เจฏเฉ‚เจจเจฟเจ•เจธ เจตเจฟเฉฑเจš เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ?" เจจเจฟเจ•เจฒเจฟเจ† เจจเจพ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจฌเจฃเจคเจฐ เจฌเจพเจฐเฉ‡. เจฎเฉˆเจ‚ เจ‰เจคเจธเฉเจ• เจนเฉ‹ เจ—เจฟเจ† เจ…เจคเฉ‡ เจœเจตเจพเจฌ เจฒเฉฑเจญเจฃ เจฒเจˆ เจชเฉเจฐเจพเจฃเฉ‡ เจธเจฐเฉ‹เจคเจพเจ‚ เจจเฉ‚เฉฐ เจ–เฉ‹เจฆเจฟเจ†เฅค

เจ…เจธเฉ€เจ‚ เจ•เจฟเจธ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚?

เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚, "เจธเจผเจพเจ‡เจฆ เจฏเฉ‚เจจเจฟเจ•เจธ เจตเจฟเฉฑเจš เจธเจญ เจคเฉ‹เจ‚ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจ•เจพเจข," เจ›เฉ‹เจŸเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจชเจธ เจตเจฟเฉฑเจš เจœเฉ‹เฉœเจจ เจฆเฉ‡ เจ…เฉฐเจคเจฐเฉ€เจต เจฏเฉ‚เจจเจฟเจ•เจธ เจซเจผเจฒเจธเจซเจผเฉ‡ เจฆเฉ€ เจ‡เฉฑเจ• เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจจเจพเจฒ เจนเฉ€ เจ•เจฎเจพเจ‚เจก เจฒเจพเจˆเจจ 'เจคเฉ‡ เจ‡เฉฑเจ• เจœเจพเจฃเฉ‚ เจšเจฟเฉฐเจจเฉเจน เจนเฉˆ:

$ 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()เจฎเจพเจŠเจ‚เจŸ เจ•เฉ€เจคเฉ‡ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ. เจ‡เฉฑเจ• เจฌเจพเจฒ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ‡เฉฑเจ• เจนเฉˆเจ‚เจกเจฒ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฆเฉ€ เจนเฉˆ, เจ…เจคเฉ‡ เจฆเฉ‚เจœเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ‚เจœเฉ‡ เจนเฉˆเจ‚เจกเจฒ เจคเฉ‹เจ‚ เจ‰เจนเฉ€ เจกเฉ‡เจŸเจพ เจชเฉœเฉเจนเจฆเฉ€ เจนเฉˆเฅค เจธเจผเฉˆเฉฑเจฒ stdin เจ…เจคเฉ‡ stdout เจจเจพเจฒ เจฎเฉ‡เจฒ เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจฃเจจเจ•เจฐเจคเจพ 2 เจ…เจคเฉ‡ 3 เจจเฉ‚เฉฐ "เจฐเจฟเจจเจพเจฎ" เจ•เจฐเจจ เจฒเจˆ dup4 เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจชเจพเจˆเจชเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚, เจธเจผเฉˆเฉฑเจฒ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเจพ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฃเจพ เจชเจเจ—เจพ เจ…เจคเฉ‡ เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจฒเจˆ เจ‡เจธเจจเฉ‚เฉฐ เจฆเฉ‚เจœเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจชเจพเจธ เจ•เจฐเจจเจพ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจ…เจธเฉ€เจ‚ เจนเฉ‹เจฐ เจธเจฐเฉ‹เจค เจ…เจคเฉ‡ เจกเจฟเจธเจ• เจธเจชเฉ‡เจธ เจฌเจฐเจฌเจพเจฆ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจจเจพ เจธเจฟเจฐเจซ เจšเฉฐเจ—เฉ€เจ†เจ‚ เจนเจจ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ…เจธเจฅเจพเจˆ เจซเจพเจˆเจฒเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจคเฉ‹เจ‚ เจฌเจšเจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ:

เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ–เจพเจฒเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจนเฉ€ เจนเฉˆ เจคเจพเจ‚ read(2) เจกเจพเจŸเจพ เจ‰เจชเจฒเจฌเจง เจนเฉ‹เจฃ เจคเฉฑเจ• เจฌเจฒเฉŒเจ• เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค เจœเฉ‡เจ•เจฐ เจ•เฉ‹เจˆ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจชเฉ‚เจฐเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ write(2) เจ‰เจฆเฉ‹เจ‚ เจคเฉฑเจ• เจฌเจฒเฉŒเจ• เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจฒเจฟเจ–เจฃ เจฒเจˆ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจ•เจพเจซเจผเฉ€ เจกเฉ‡เจŸเจพ เจชเฉœเฉเจนเจฟเจ† เจจเจนเฉ€เจ‚ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

POSIX เจฒเฉ‹เฉœเจพเจ‚ เจตเจพเจ‚เจ—, เจ‡เจน เจ‡เฉฑเจ• เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจนเฉˆ: เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจคเฉฑเจ• เจฒเจฟเจ–เจฃเจพ PIPE_BUF เจฌเจพเจˆเจŸเจธ (เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ 512) เจชเจฐเจฎเจพเจฃเฉ‚ เจนเฉ‹เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจ เจคเจพเจ‚ เจœเฉ‹ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฐเจพเจนเฉ€เจ‚ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจจเจพเจฒ เจ‡เจธ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจธเฉฐเจšเจพเจฐ เจ•เจฐ เจธเจ•เจฃ เจ•เจฟ เจจเจฟเจฏเจฎเจค เจซเจพเจˆเจฒเจพเจ‚ (เจœเฉ‹ เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจ—เจฐเฉฐเจŸเฉ€เจ†เจ‚ เจชเฉเจฐเจฆเจพเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ€เจ†เจ‚) เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ€เจ†เจ‚เฅค

เจ‡เฉฑเจ• เจจเจฟเจฏเจฎเจค เจซเจพเจˆเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ‡เจธเจฆเฉ‡ เจธเจพเจฐเฉ‡ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจจเฉ‚เฉฐ เจ‡เจธ เจตเจฟเฉฑเจš เจฒเจฟเจ– เจธเจ•เจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจญเฉ‡เจœ เจธเจ•เจฆเฉ€ เจนเฉˆ. เจœเจพเจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจนเฉ€ เจธเจฎเจพเจจเจพเจ‚เจคเจฐ เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ, เจ‡เฉฑเจ• เจฌเจพเจนเจฐเฉ€ เจธเจฟเจ—เจจเจฒ เจตเจฟเจงเฉ€ (เจœเจฟเจตเฉ‡เจ‚ เจ‡เฉฑเจ• เจธเฉˆเจฎเจพเจซเฉ‹เจฐ) เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจจเฉ‚เฉฐ เจธเฉ‚เจšเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจฒเจฟเจ–เจฃเจพ เจœเจพเจ‚ เจชเฉœเฉเจนเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ•เจจเจตเฉ‡เจ…เจฐ เจธเจพเจจเฉ‚เฉฐ เจ‡เจธ เจธเจพเจฐเฉ€ เจชเจฐเฉ‡เจธเจผเจพเจจเฉ€ เจคเฉ‹เจ‚ เจฌเจšเจพเจ‰เจ‚เจฆเฉ‡ เจนเจจเฅค

เจ…เจธเฉ€เจ‚ เจ•เฉ€ เจฒเฉฑเจญ เจฐเจนเฉ‡ เจนเจพเจ‚?

เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเจงเจพเจฐเจจ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฟเจ†เจ–เจฟเจ† เจ•เจฐเจพเจ‚เจ—เจพ เจคเจพเจ‚ เจœเฉ‹ เจคเฉเจนเจพเจกเฉ‡ เจฒเจˆ เจ‡เจน เจ•เจฒเจชเจจเจพ เจ•เจฐเจจเจพ เจ†เจธเจพเจจ เจนเฉ‹เจตเฉ‡ เจ•เจฟ เจ‡เฉฑเจ• เจ•เจจเจตเฉ‡เจ…เจฐ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฌเจซเจฐ เจ…เจคเฉ‡ เจ•เฉเจ เจฐเจพเจœ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฌเจซเจฐ เจคเฉ‹เจ‚ เจกเจพเจŸเจพ เจœเฉ‹เฉœเจจ เจ…เจคเฉ‡ เจนเจŸเจพเจ‰เจฃ เจฒเจˆ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจคเฉเจนเจพเจจเฉ‚เฉฐ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐเจพเจ‚ 'เจคเฉ‡ เจฐเฉ€เจก เจ…เจคเฉ‡ เจฐเจพเจˆเจŸ เจ“เจชเจฐเฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉŒเจฐเจพเจจ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจจ เจฒเจˆ เจ•เฉเจ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€เฅค เจ…เจคเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเฉ‡ เจ—เจ เจตเจฟเจธเจผเฉ‡เจธเจผ เจตเจฟเจตเจนเจพเจฐ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจคเจพเจฒเฉ‡ เจฆเฉ€ เจฒเฉ‹เฉœ เจชเจตเฉ‡เจ—เฉ€เฅค

เจนเฉเจฃ เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ…เจธเจชเจธเจผเจŸ เจฎเจพเจจเจธเจฟเจ• เจฎเจพเจกเจฒ เจฆเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจ•เจฐเจจ เจœเจพเจ‚ เจ—เจฒเจค เจธเจพเจฌเจค เจ•เจฐเจจ เจฒเจˆ เจšเจฎเจ•เจฆเจพเจฐ เจฒเฉˆเจ‚เจชเจฒเจพเจˆเจŸ เจฆเฉ‡ เจ…เจงเฉ€เจจ เจ•เจฐเจจเจฒ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจฆเฉ€ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจ•เจฐเจจ เจฒเจˆ เจคเจฟเจ†เจฐ เจนเจพเจ‚เฅค เจชเจฐ เจนเจฎเฉ‡เจธเจผเจพ เจ…เจšเจพเจจเจ• เจฒเจˆ เจคเจฟเจ†เจฐ เจฐเจนเฉ‹.

เจ…เจธเฉ€เจ‚ เจ•เจฟเฉฑเจฅเฉ‡ เจฆเฉ‡เจ– เจฐเจนเฉ‡ เจนเจพเจ‚?

เจฎเฉˆเจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจชเจคเจพ เจ•เจฟ เจฎเฉ‡เจฐเฉ€ เจฎเจธเจผเจนเฉ‚เจฐ เจ•เจฟเจคเจพเจฌ เจฆเฉ€ เจ•เจพเจชเฉ€ เจ•เจฟเฉฑเจฅเฉ‡ เจนเฉˆ "เจธเจผเฉ‡เจฐเจพเจ‚ เจฆเฉ€ เจ•เจฟเจคเจพเจฌเจฏเฉ‚เจจเจฟเจ•เจธ 6 เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจฆเฉ‡ เจจเจพเจฒ, เจชเจฐ เจงเฉฐเจจเจตเจพเจฆ เจฏเฉ‚เจจเจฟเจ•เจธ เจนเฉˆเจฐเฉ€เจŸเฉ‡เจœ เจธเฉเจธเจพเจ‡เจŸเฉ€ 'เจคเฉ‡ เจ†เจจเจฒเจพเจˆเจจ เจ–เฉ‹เจœ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจธเฉ‚เจคเจฐ เจธเฉฐเจ•เฉ‡เจคเจพเจตเจฒเฉ€ เจฏเฉ‚เจจเจฟเจ•เจธ เจฆเฉ‡ เจตเฉ€ เจชเฉเจฐเจพเจฃเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃเฅค

TUHS เจชเฉเจฐเจพเจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจš เจ˜เฉเฉฐเจฎเจฃเจพ เจ‡เฉฑเจ• เจ…เจœเจพเจ‡เจฌ เจ˜เจฐ เจตเจฟเฉฑเจš เจœเจพเจฃ เจตเจฐเจ—เจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจธเจพเจ‚เจเฉ‡ เจ‡เจคเจฟเจนเจพเจธ เจจเฉ‚เฉฐ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจชเฉเจฐเจพเจฃเฉ€เจ†เจ‚ เจŸเฉ‡เจชเจพเจ‚ เจ…เจคเฉ‡ เจชเฉเจฐเจฟเฉฐเจŸเจธ เจคเฉ‹เจ‚ เจ‡เจธ เจธเจพเจฐเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจจเฉ‚เฉฐ เจฅเฉ‹เฉœเฉเจนเจพ-เจฅเฉ‹เฉœเฉเจนเจพ เจ•เจฐเจ•เฉ‡ เจฎเฉเฉœ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจ•เจˆ เจธเจพเจฒเจพเจ‚ เจฆเฉ‡ เจฏเจคเจจเจพเจ‚ เจฆเจพ เจธเจจเจฎเจพเจจ เจ•เจฐเจฆเจพ เจนเจพเจ‚เฅค เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจ‰เจจเฉเจนเจพเจ‚ เจŸเฉเจ•เฉœเจฟเจ†เจ‚ เจฌเจพเจฐเฉ‡ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจœเจพเจฃเฉ‚ เจนเจพเจ‚ เจœเฉ‹ เจ…เจœเฉ‡ เจตเฉ€ เจฒเจพเจชเจคเจพ เจนเจจ.

เจ•เจจเจตเฉ‡เจ…เจฐเจพเจ‚ เจฆเฉ‡ เจชเฉเจฐเจพเจšเฉ€เจจ เจ‡เจคเจฟเจนเจพเจธ เจฌเจพเจฐเฉ‡ เจธเจพเจกเฉ€ เจ‰เจคเจธเฉเจ•เจคเจพ เจจเฉ‚เฉฐ เจธเฉฐเจคเฉเจธเจผเจŸ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจคเฉเจฒเจจเจพ เจฒเจˆ เจ†เจงเฉเจจเจฟเจ• เจ•เจฐเจจเจฒ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค

เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจ•เจฐ เจ•เฉ‡, pipe เจธเจพเจฐเจฃเฉ€ เจตเจฟเฉฑเจš เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจจเฉฐเจฌเจฐ 42 เจนเฉˆ sysent[]. เจ‡เจคเจซเจผเจพเจ•?

เจฐเจตเจพเจ‡เจคเฉ€ เจฏเฉ‚เจจเจฟเจ•เจธ เจ•เจฐเจจเจฒ (1970-1974)

เจฎเฉˆเจจเฉ‚เฉฐ เจ•เฉ‹เจˆ เจจเจฟเจธเจผเจพเจจ เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเจฟเจ† pipe(2) เจจเจพ เจนเฉ€ เจ…เฉฐเจฆเจฐ PDP-7 เจฏเฉ‚เจจเจฟเจ•เจธ (เจœเจจเจตเจฐเฉ€ 1970), เจจเจพ เจนเฉ€ เจตเจฟเฉฑเจš เจฏเฉ‚เจจเจฟเจ•เจธ เจฆเจพ เจชเจนเจฟเจฒเจพ เจเจกเฉ€เจธเจผเจจ (เจจเจตเฉฐเจฌเจฐ 1971), เจจเจพ เจนเฉ€ เจ…เจงเฉ‚เจฐเฉ‡ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจฆเฉ‚เจœเจพ เจเจกเฉ€เจธเจผเจจ (เจœเฉ‚เจจ 1972)เฅค

TUHS เจ•เจนเจฟเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจฏเฉ‚เจจเจฟเจ•เจธ เจฆเจพ เจคเฉ€เจœเจพ เจเจกเฉ€เจธเจผเจจ (เจซเจฐเจตเจฐเฉ€ 1973) เจ•เจจเจตเฉ‡เจ…เจฐ เจจเจพเจฒ เจชเจนเจฟเจฒเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจฌเจฃ เจ—เจฟเจ†:

เจฏเฉ‚เจจเจฟเจ•เจธ เจคเฉ€เจธเจฐเจพ เจเจกเฉ€เจธเจผเจจ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ‡เฉฑเจ• เจ•เจฐเจจเจฒ เจตเจพเจฒเจพ เจ†เจ–เจฐเฉ€ เจธเฉฐเจธเจ•เจฐเจฃ เจธเฉ€, เจชเจฐ เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจตเจพเจฒเจพ เจชเจนเจฟเจฒเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจตเฉ€ เจธเฉ€เฅค 1973 เจฆเฉ‡ เจฆเฉŒเจฐเจพเจจ, เจคเฉ€เจœเฉ‡ เจเจกเฉ€เจธเจผเจจ เจตเจฟเฉฑเจš เจธเฉเจงเจพเจฐ เจ•เจฐเจจ เจฒเจˆ เจ•เฉฐเจฎ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจ•เจฐเจจเจฒ เจจเฉ‚เฉฐ C เจตเจฟเฉฑเจš เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฏเฉ‚เจจเจฟเจ•เจธ เจฆเจพ เจšเฉŒเจฅเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจชเฉเจฐเจ—เจŸ เจนเฉ‹เจ‡เจ†เฅค

เจ‡เฉฑเจ• เจชเจพเจ เจ• เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจฆเจพ เจธเจ•เฉˆเจจ เจฎเจฟเจฒเจฟเจ† เจœเจฟเจธ เจตเจฟเฉฑเจš เจกเฉฑเจ— เจฎเฉˆเจ•เจฟเจฒเจฐเฉ‹เจ เจจเฉ‡ "เจฌเจ—เฉ€เจšเฉ‡ เจฆเฉ€ เจนเฉ‹เจœเจผ เจตเจพเจ‚เจ— เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจ" เจฆเจพ เจตเจฟเจšเจพเจฐ เจชเฉ‡เจธเจผ เจ•เฉ€เจคเจพเฅค

เจฏเฉ‚เจจเจฟเจ•เจธ เจตเจฟเฉฑเจš เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ
เจฌเฉเจฐเจพเจ‡เจจ เจ•เฉ‡เจฐเจจเฉ€เจ˜เจจ เจฆเฉ€ เจ•เจฟเจคเจพเจฌ เจตเจฟเฉฑเจšเจฏเฉ‚เจจเจฟเจ•เจธ: เจ‡เฉฑเจ• เจ‡เจคเจฟเจนเจพเจธ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจฏเจพเจฆ", เจ•เจจเจตเฉ‡เจ…เจฐเจพเจ‚ เจฆเฉ‡ เจ‰เจญเจพเจฐ เจฆเฉ‡ เจ‡เจคเจฟเจนเจพเจธ เจตเจฟเฉฑเจš, เจ‡เจธ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจฆเจพ เจตเฉ€ เจœเจผเจฟเจ•เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ: "... เจ‡เจน 30 เจธเจพเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจฌเฉˆเฉฑเจฒ เจฒเฉˆเจฌเจœเจผ เจตเจฟเฉฑเจš เจฎเฉ‡เจฐเฉ‡ เจฆเจซเจผเจคเจฐ เจตเจฟเฉฑเจš เจ•เฉฐเจง 'เจคเฉ‡ เจฒเจŸเจ•เจฟเจ† เจนเฉ‹เจ‡เจ† เจนเฉˆเฅค" เจ‡เจฅเฉ‡ McIlroy เจจเจพเจฒ เจ‡เฉฐเจŸเจฐเจตเจฟเจŠ, เจ…เจคเฉ‡ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจ•เจนเจพเจฃเฉ€ เจฎเฉˆเจ•เจฟเจฒเจฐเฉ‹เจ เจฆเจพ เจ•เฉฐเจฎ, 2014 เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ†:

เจœเจฆเฉ‹เจ‚ เจฏเฉ‚เจจเจฟเจ•เจธ เจฌเจพเจนเจฐ เจ†เจ‡เจ†, เจคเจพเจ‚ เจ•เฉ‹เจฐเฉ‹เจŸเฉ€เจจ เจฆเฉ‡ เจจเจพเจฒ เจฎเฉ‡เจฐเจพ เจฎเฉ‹เจน เจฎเฉˆเจจเฉ‚เฉฐ OS เจฆเฉ‡ เจฒเฉ‡เจ–เจ•, เจ•เฉ‡เจจ เจฅเฉŒเจฎเจธเจจ เจจเฉ‚เฉฐ เจชเฉเฉฑเจ›เจฃ เจฒเจˆ เจชเฉเจฐเฉ‡เจฐเจฟเจค เจ•เจฐเจฆเจพ เจธเฉ€, เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฒเจˆ เจฒเจฟเจ–เฉ‡ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจจเจพ เจธเจฟเจฐเจซเจผ เจกเจฟเจตเจพเจˆเจธ เจตเจฟเฉฑเจš เจœเจพเจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเฉ‡เจฃ เจฒเจˆ, เจธเจ—เฉ‹เจ‚ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจ•เจฐเจจ เจฒเจˆ เจตเฉ€เฅค เจ•เฉ‡เจจ เจจเฉ‡ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจ•เจฟ เจ‡เจน เจธเฉฐเจญเจต เจธเฉ€. เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เฉฑเจ• เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจ‰เจน เจšเจพเจนเฉเฉฐเจฆเจพ เจธเฉ€ เจ•เจฟ เจนเจฐเฉ‡เจ• เจธเจฟเจธเจŸเจฎ เจซเฉฐเจ•เจธเจผเจจ เจ‡เฉฑเจ• เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจญเฉ‚เจฎเจฟเจ•เจพ เจจเจฟเจญเจพเจตเฉ‡เฅค เจ•เฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจธเจฟเฉฑเจงเจพ เจฒเจฟเจ–เจฃเจพ เจ‡เฉฑเจ• เจ‡เฉฐเจŸเจฐเจฎเฉ€เจกเฉ€เจเจŸ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจจเจพเจฒเฉ‹เจ‚ เจ‡เฉฑเจ• เจตเฉฑเจกเจพ เจซเจพเจ‡เจฆเจพ เจนเฉˆ? เจ‡เจน เจ‰เจฆเฉ‹เจ‚ เจนเฉ€ เจธเฉ€ เจœเจฆเฉ‹เจ‚ เจฎเฉˆเจ‚ เจ†เจ•เจฐเจธเจผเจ• เจจเจพเจฎ "เจชเจพเจˆเจชเจฒเจพเจˆเจจ" เจ…เจคเฉ‡ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจ†เจชเจธเฉ€ เจคเจพเจฒเจฎเฉ‡เจฒ เจฒเจˆ เจธเฉฐเจŸเฉˆเจ•เจธ เจฆเฉ‡ เจตเจฐเจฃเจจ เจจเจพเจฒ เจ‡เฉฑเจ• เจ–เจพเจธ เจชเฉเจฐเจธเจคเจพเจต เจฌเจฃเจพเจ‡เจ† เจธเฉ€ เจœเฉ‹ เจ•เฉ‡เจจ เจจเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจ•เจฟเจนเจพ: "เจฎเฉˆเจ‚ เจ‡เจน เจ•เจฐเจพเจ‚เจ—เจพ!"

เจ…เจคเฉ‡ เจ•เฉ€เจคเจพ. เจ‡เฉฑเจ• เจญเจฟเจ†เจจเจ• เจธเจผเจพเจฎ, เจ•เฉ‡เจจ เจจเฉ‡ เจ•เจฐเจจเจฒ เจ…เจคเฉ‡ เจธเจผเฉˆเฉฑเจฒ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฟเจ†, เจ•เจˆ เจฎเจฟเจ†เจฐเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจฟเจ†เจฐเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจซเจฟเจ•เจธ เจ•เฉ€เจคเจพ เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจจเฉ‡ เจ‡เฉฐเจชเฉเฉฑเจŸ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจธเจตเฉ€เจ•เจพเจฐ เจ•เฉ€เจคเจพ (เจœเฉ‹ เจ•เจฟ เจ‡เฉฑเจ• เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจ† เจธเจ•เจฆเจพ เจนเฉˆ), เจ…เจคเฉ‡ เจซเจพเจˆเจฒ เจฆเฉ‡ เจจเจพเจฎ เจตเฉ€ เจฌเจฆเจฒเฉ‡เฅค เจ…เจ—เจฒเฉ‡ เจฆเจฟเจจ, เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจจเฉ‚เฉฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจตเจฟเจ†เจชเจ• เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจœเจพเจฃ เจฒเฉฑเจ—เจพเฅค เจนเจซเจผเจคเฉ‡ เจฆเฉ‡ เจ…เฉฐเจค เจคเฉฑเจ•, เจธเจ•เฉฑเจคเจฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฐเจก เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐเจพเจ‚ เจคเฉ‹เจ‚ เจชเฉเจฐเจฟเฉฐเจŸเจฐ เจคเฉฑเจ• เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจญเฉ‡เจœเจฃ เจฒเจˆ เจตเจฐเจค เจฐเจนเฉ‡ เจธเจจเฅค เจฅเฉ‹เฉœเฉเจนเฉ€ เจฆเฉ‡เจฐ เจฌเจพเจ…เจฆ, เจ•เฉ‡เจจ เจจเฉ‡ เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเฉ‚เฉฐ เจ•เจฒเฉ€เจจเจฐ เจ•เจจเจตเฉˆเจจเจธเจผเจจเจพเจ‚ เจจเจพเจฒ เจธเจฎเฉ‡เจŸเจฃ เจฒเจˆ เจ…เจธเจฒเฉ€ API เจ…เจคเฉ‡ เจธเฉฐเจŸเฉˆเจ•เจธ เจจเฉ‚เฉฐ เจฌเจฆเจฒ เจฆเจฟเฉฑเจคเจพ, เจœเฉ‹ เจ•เจฟ เจ‰เจฆเฉ‹เจ‚ เจคเฉ‹เจ‚ เจตเจฐเจคเจฟเจ† เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆเฅค

เจฌเจฆเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจคเฉ€เจœเฉ‡ เจเจกเฉ€เจธเจผเจจ เจฏเฉ‚เจจเจฟเจ•เจธ เจ•เจฐเจจเจฒ เจฒเจˆ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจ—เฉเฉฐเจฎ เจนเฉ‹ เจ—เจฟเจ† เจนเฉˆเฅค เจ…เจคเฉ‡ เจนเจพเจฒเจพเจ‚เจ•เจฟ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ•เจฐเจจเจฒ เจธเฉ‹เจฐเจธ เจ•เฉ‹เจก C เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจนเฉ‹เจ‡เจ† เจนเฉˆ เจšเฉŒเจฅเจพ เจเจกเฉ€เจธเจผเจจ, เจจเจตเฉฐเจฌเจฐ 1973 เจตเจฟเฉฑเจš เจœเจพเจฐเฉ€ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจชเจฐ เจ‡เจน เจ…เจงเจฟเจ•เจพเจฐเจค เจฐเจฟเจฒเฉ€เจœเจผ เจคเฉ‹เจ‚ เจ•เจˆ เจฎเจนเฉ€เจจเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจธเจพเจนเจฎเจฃเฉ‡ เจ†เจ‡เจ† เจธเฉ€ เจ…เจคเฉ‡ เจ‡เจธ เจตเจฟเฉฑเจš เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฒเจพเจ—เฉ‚เจ•เจฐเจจ เจธเจผเจพเจฎเจฒ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ‡เจน เจธเจผเจฐเจฎเจจเจพเจ• เจนเฉˆ เจ•เจฟ เจ‡เจธ เจฎเจนเจพเจจ เจฏเฉ‚เจจเจฟเจ•เจธ เจซเฉฐเจ•เจธเจผเจจ เจฒเจˆ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจ—เฉเฉฐเจฎ เจนเฉ‹ เจ—เจฟเจ† เจนเฉˆ, เจธเจผเจพเจ‡เจฆ เจนเจฎเฉ‡เจธเจผเจพ เจฒเจˆเฅค

เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจŸเฉˆเจ•เจธเจŸ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจนเจจ pipe(2) เจฆเฉ‹เจตเจพเจ‚ เจฐเฉ€เจฒเฉ€เจœเจผเจพเจ‚ เจคเฉ‹เจ‚, เจคเจพเจ‚ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฆเฉ€ เจ–เฉ‹เจœ เจ•เจฐเจ•เฉ‡ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจธเจ•เฉ‹ เจคเฉ€เจœเจพ เจเจกเฉ€เจธเจผเจจ (เจ•เฉเจ เจธเจผเจฌเจฆเจพเจ‚ เจฒเจˆ, "เจนเฉฑเจฅเฉ€เจ‚" เจฐเฉ‡เจ–เจพเจ‚เจ•เจฟเจค, เจ…เฉฑเจ–เจฐเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเจคเจฐ ^H, เจ‡เจธเจฆเฉ‡ เจฌเจพเจ…เจฆ เจ‡เฉฑเจ• เจ…เฉฐเจกเจฐเจธเจ•เฉ‹เจฐ!) เจ‡เจน เจชเฉเจฐเฉ‹เจŸเฉ‹-pipe(2) เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆ เจ…เจคเฉ‡ เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‰เจฎเฉ€เจฆ เจ•เฉ€เจคเฉ€ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ:

เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจชเจพเจˆเจช เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเจพเจฎเจ• เจ‡เฉฑเจ• เจ‡เจจเจชเฉเจŸ/เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจตเจฟเจงเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจตเจพเจชเจธ เจ•เฉ€เจคเฉ€ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจ…เจคเฉ‡ เจฒเจฟเจ–เจฃ เจฆเฉ€เจ†เจ‚ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจœเจฆเฉ‹เจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจ 'เจคเฉ‡ เจ•เฉเจ เจฒเจฟเจ–เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ 504 เจฌเจพเจˆเจŸ เจคเฉฑเจ• เจฆเจพ เจกเจพเจŸเจพ เจฌเจซเจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฎเฉเจ…เฉฑเจคเจฒ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจฌเจซเจฐเจก เจกเฉ‡เจŸเจพ เจ–เฉ‹เจน เจฒเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจ…เจ—เจฒเฉ‡ เจธเจพเจฒ เจคเฉฑเจ• เจ•เจฐเจจเจฒ เจจเฉ‚เฉฐ C เจตเจฟเฉฑเจš เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจชเจพเจˆเจช (2) เจšเฉŒเจฅเฉ‡ เจเจกเฉ€เจธเจผเจจ เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจŸเฉ‹เจŸเจพเจˆเจช เจจเจพเจฒ เจ‡เจธเจฆเฉ€ เจ†เจงเฉเจจเจฟเจ• เจฆเจฟเฉฑเจ– เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ€ "pipe(fildes)"

เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจชเจพเจˆเจช เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเจพเจฎเจ• เจ‡เฉฑเจ• เจ‡เจจเจชเฉเจŸ/เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจตเจฟเจงเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจตเจพเจชเจธ เจ•เฉ€เจคเฉ‡ เจ—เจ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ เจ…เจคเฉ‡ เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจ•เจพเจฐเจœเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจœเจฆเฉ‹เจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจ 'เจคเฉ‡ เจ•เฉเจ เจฒเจฟเจ–เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ r1 (resp. fildes[1]) เจตเจฟเฉฑเจš เจตเจพเจชเจธ เจ†เจ เจนเฉˆเจ‚เจกเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจกเฉ‡เจŸเจพ เจฆเฉ‡ 4096 เจฌเจพเจˆเจŸเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจซเจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฎเฉเจ…เฉฑเจคเจฒ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจนเฉˆเจ‚เจกเจฒ r0 (resp. fildes[0]) 'เจคเฉ‡ เจตเจพเจชเจธ เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจกเฉ‡เจŸเจพ เจฒเฉˆเจ‚เจฆเจพ เจนเฉˆเฅค

เจ‡เจน เจฎเฉฐเจจเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เฉฑเจ• เจตเจพเจฐ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฆเฉ‹ (เจœเจพเจ‚ เจตเฉฑเจง) เจธเฉฐเจšเจพเจฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ (เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฆเฉ€เจ†เจ‚ เจ•เจพเจฒเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจฌเจฃเจพเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจซเฉ‹เจฐเจ•) เจ•เจพเจฒเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจกเจพเจŸเจพ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เจฐเฉ‡เจ—เจพ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจ ะธ เจฒเจฟเจ–เจฃ เจฆเฉ€.

เจธเจผเฉˆเฉฑเจฒ เจตเจฟเฉฑเจš เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฆเฉเจ†เจฐเจพ เจœเฉเฉœเฉ€เจ†เจ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจฒเฉ€เจจเฉ€เจ…เจฐ เจเจฐเฉ‡ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจธเฉฐเจŸเฉˆเจ•เจธ เจนเฉˆเฅค

เจ‡เฉฑเจ• เจ–เจพเจฒเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเจจ เจฒเจˆ เจ•เจพเจฒเจพเจ‚ (เจœเจฟเจธ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจฌเจซเจฐเจก เจกเฉ‡เจŸเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ) เจœเจฟเจธเจฆเจพ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจธเจฟเจฐเจพ เจนเฉˆ (เจธเจพเจฐเฉ‡ เจฒเจฟเจ–เจฃ เจตเจพเจฒเฉ‡ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจฌเฉฐเจฆ เจนเจจ) "เจซเจพเจ‡เจฒ เจฆเจพ เจ…เฉฐเจค" เจตเจพเจชเจธ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจ‡เฉฑเจ• เจธเจฎเจพเจจ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฃ เจฒเจˆ เจ•เจพเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจฃเจกเจฟเฉฑเจ  เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฒเจพเจ—เฉ‚ เจนเจตเจพเจฒเจพ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจฏเฉ‚เจจเจฟเจ•เจธ เจฆเฉ‡ เจชเฉฐเจœเจตเฉ‡เจ‚ เจเจกเฉ€เจธเจผเจจ เจฒเจˆ (เจœเฉ‚เจจ 1974), เจชเจฐ เจ‡เจน เจ…เจ—เจฒเฉ€ เจฐเฉ€เจฒเฉ€เจœเจผ เจตเจฟเฉฑเจš เจชเฉเจฐเจ—เจŸ เจนเฉ‹เจฃ เจตเจพเจฒเฉ‡ เจ‡เฉฑเจ• เจตเจฐเจ—เจพ เจนเฉ€ เจนเฉˆเฅค เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจนเฉเจฃเฉ‡ เจœเฉ‹เฉœเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจ, เจ‡เจธ เจฒเจˆ เจคเฉเจธเฉ€เจ‚ เจชเฉฐเจœเจตเฉ‡เจ‚ เจธเฉฐเจธเจ•เจฐเจจ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจฏเฉ‚เจจเจฟเจ•เจธ เจฆเจพ เจ›เฉ‡เจตเจพเจ‚ เจเจกเฉ€เจธเจผเจจ (1975)

เจ†เจ“ เจฏเฉ‚เจจเจฟเจ•เจธ เจธเฉ‹เจฐเจธ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ เจ›เฉ‡เจตเจพเจ‚ เจเจกเฉ€เจธเจผเจจ (เจฎเจˆ 1975)เฅค เจฆเจพ เจตเฉฑเจกเฉ‡ เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจงเฉฐเจจเจตเจพเจฆ เจฒเจพเจ‡เจจเจœเจผ เจชเฉเจฐเจพเจฃเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจฆเฉ‡ เจธเจฐเฉ‹เจคเจพเจ‚ เจจเจพเจฒเฉ‹เจ‚ เจ‡เจน เจฒเฉฑเจญเจฃเจพ เจฌเจนเฉเจค เจธเฉŒเจ–เจพ เจนเฉˆ:

เจ•เจˆ เจธเจพเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจ•เจฟเจคเจพเจฌ เจฒเจพเจ‡เจจเจœเจผ เจฌเฉ‡เจฒ เจฒเฉˆเจฌเจœเจผ เจฆเฉ‡ เจฌเจพเจนเจฐ เจ‰เจชเจฒเจฌเจง เจฏเฉ‚เจจเจฟเจ•เจธ เจ•เจฐเจจเจฒ เจฆเจพ เจ‡เฉฑเจ•เฉ‹-เจ‡เฉฑเจ• เจฆเจธเจคเจพเจตเฉ‡เจœเจผ เจธเฉ€เฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ›เฉ‡เจตเฉ‡เจ‚ เจเจกเฉ€เจธเจผเจจ เจฆเฉ‡ เจฒเจพเจ‡เจธเฉˆเจ‚เจธ เจจเฉ‡ เจ…เจงเจฟเจ†เจชเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ‡ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฑเจคเฉ€, เจธเฉฑเจคเจตเฉ‡เจ‚ เจเจกเฉ€เจธเจผเจจ เจฆเฉ‡ เจฒเจพเจ‡เจธเฉˆเจ‚เจธ เจจเฉ‡ เจ‡เจธ เจธเฉฐเจญเจพเจตเจจเจพ เจจเฉ‚เฉฐ เจฌเจพเจนเจฐ เจฐเฉฑเจ–เจฟเจ†, เจ‡เจธเจฒเจˆ เจ•เจฟเจคเจพเจฌ เจจเฉ‚เฉฐ เจ—เฉˆเจฐ-เจ•เจพเจจเฉ‚เฉฐเจจเฉ€ เจŸเจพเจˆเจชเจฐเจพเจˆเจŸ เจ•เจพเจชเฉ€เจ†เจ‚ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจตเฉฐเจกเจฟเจ† เจ—เจฟเจ†เฅค

เจ…เฉฑเจœ เจคเฉเจธเฉ€เจ‚ เจ•เจฟเจคเจพเจฌ เจฆเจพ เจฎเฉเฉœ-เจชเฉเจฐเจฟเฉฐเจŸ เจ–เจฐเฉ€เจฆ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเจฟเจธ เจฆเจพ เจ•เจตเจฐ เจ•เจพเจชเฉ€ เจฎเจธเจผเฉ€เจจ 'เจคเฉ‡ เจตเจฟเจฆเจฟเจ†เจฐเจฅเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจ…เจคเฉ‡ เจตเจพเจฐเจจ เจŸเฉ‚เจฎเฉ€ เจฆเจพ เจงเฉฐเจจเจตเจพเจฆ (เจœเจฟเจธ เจจเฉ‡ TUHS เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ) เจคเฉเจธเฉ€เจ‚ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ›เฉ‡เจตเฉ‡เจ‚ เจเจกเฉ€เจธเจผเจจ เจฒเจˆ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจตเจพเจฒเฉ€ PDF เจซเจพเจˆเจฒ. เจฎเฉˆเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเจฟเจšเจพเจฐ เจฆเฉ‡เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจซเจพเจˆเจฒ เจฌเจฃเจพเจ‰เจฃ เจตเจฟเฉฑเจš เจ•เจฟเฉฐเจจเฉ€ เจฎเจฟเจนเจจเจค เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ:

15 เจธเจพเจฒ เจชเจนเจฟเจฒเจพเจ‚, เจฎเฉˆเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจ—เจ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจฆเฉ€ เจ‡เฉฑเจ• เจ•เจพเจชเฉ€ เจŸเจพเจˆเจช เจ•เฉ€เจคเฉ€ เจธเฉ€ เจฒเจพเจ‡เจจเจœเจผ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฎเฉˆเจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจ•เจพเจชเฉ€เจ†เจ‚ เจฆเฉ€ เจ…เจฃเจœเจพเจฃ เจ—เจฟเจฃเจคเฉ€ เจคเฉ‹เจ‚ เจฎเฉ‡เจฐเฉ€ เจ•เจพเจชเฉ€ เจฆเฉ€ เจ—เฉเจฃเจตเฉฑเจคเจพ เจชเจธเฉฐเจฆ เจจเจนเฉ€เจ‚ เจธเฉ€เฅค TUHS เจ…เจœเฉ‡ เจฎเฉŒเจœเฉ‚เจฆ เจจเจนเฉ€เจ‚ เจธเฉ€ เจ…เจคเฉ‡ เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจชเฉเจฐเจพเจฃเฉ‡ เจธเจฐเฉ‹เจคเจพเจ‚ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจจเจนเฉ€เจ‚ เจธเฉ€เฅค เจชเจฐ 1988 เจตเจฟเฉฑเจš, เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉเจฐเจพเจฃเฉ€ 9-เจŸเจฐเฉˆเจ• เจŸเฉ‡เจช เจฎเจฟเจฒเฉ€ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• PDP11 เจ•เฉฐเจชเจฟเจŠเจŸเจฐ เจคเฉ‹เจ‚ เจฌเฉˆเจ•เจ…เฉฑเจช เจธเจผเจพเจฎเจฒ เจธเฉ€เฅค เจ‡เจน เจฆเฉฑเจธเจฃเจพ เจ”เจ–เจพ เจธเฉ€ เจ•เจฟ เจ•เฉ€ เจ‡เจน เจ•เฉฐเจฎ เจ•เจฐ เจฐเจฟเจนเจพ เจธเฉ€, เจชเจฐ เจ‡เฉฑเจ• เจฌเจฐเจ•เจฐเจพเจฐ /usr/src/ เจŸเฉเจฐเฉ€ เจธเฉ€ เจœเจฟเจธ เจตเจฟเฉฑเจš เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจธเจพเจฒ 1979 เจฆเฉ‡ เจจเจพเจฒ เจฒเฉ‡เจฌเจฒ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจœเฉ‹ เจ•เจฟ เจ‰เจฆเฉ‹เจ‚ เจตเฉ€ เจชเฉเจฐเจพเจšเฉ€เจจ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจธเฉ€เฅค เจ‡เจน เจธเฉฑเจคเจตเจพเจ‚ เจเจกเฉ€เจธเจผเจจ เจธเฉ€ เจœเจพเจ‚ เจ‡เจธเจฆเจพ เจกเฉˆเจฐเฉ€เจตเฉ‡เจŸเจฟเจต PWB, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฎเฉˆเจ‚ เจตเจฟเจธเจผเจตเจพเจธ เจ•เฉ€เจคเจพ เจธเฉ€เฅค

เจฎเฉˆเจ‚ เจ–เฉ‹เจœ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ…เจงเจพเจฐ เจตเจœเฉ‹เจ‚ เจฒเจฟเจ† เจ…เจคเฉ‡ เจ›เฉ‡เจตเฉ‡เจ‚ เจเจกเฉ€เจธเจผเจจ เจตเจฟเฉฑเจš เจธเจฐเฉ‹เจคเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจธเฉฐเจชเจพเจฆเจฟเจค เจ•เฉ€เจคเจพเฅค เจ•เฉเจ เจ•เฉ‹เจก เจ‡เฉฑเจ•เฉ‹ เจœเจฟเจนเฉ‡ เจฐเจนเฉ‡, เจชเจฐ เจ•เฉเจ เจจเฉ‚เฉฐ เจฅเฉ‹เฉœเฉเจนเจพ เจธเฉฐเจชเจพเจฆเจฟเจค เจ•เจฐเจจเจพ เจชเจฟเจ†, เจ†เจงเฉเจจเจฟเจ• += เจŸเฉ‹เจ•เจจ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจฃเฉ‡ =+ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃเจพเฅค เจ•เฉเจ เจšเฉ€เจœเจผเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจฎเจฟเจŸเจพ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจ•เฉเจ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ–เจฃเจพ เจชเจฟเจ†, เจชเจฐ เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจจเจนเฉ€เจ‚เฅค

เจ…เจคเฉ‡ เจ…เฉฑเจœ เจ…เจธเฉ€เจ‚ TUHS 'เจคเฉ‡ เจ›เฉ‡เจตเฉ‡เจ‚ เจเจกเฉ€เจธเจผเจจ เจฆเจพ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจ†เจจเจฒเจพเจˆเจจ เจชเฉœเฉเจน เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ เจชเฉเจฐเจพเจฒเฉ‡เจ–, เจœเจฟเจธ เจตเจฟเฉฑเจš เจกเฉˆเจจเจฟเจธ เจฐเจฟเจšเฉ€ เจฆเจพ เจนเฉฑเจฅ เจธเฉ€.

เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ, เจชเจนเจฟเจฒเฉ€ เจจเจœเจผเจฐ 'เจคเฉ‡, เจ•เฉ‡เจฐเจจเฉ€เจ˜เจจ เจ…เจคเฉ‡ เจฐเจฟเจšเฉ€ เจฆเฉ€ เจฎเจฟเจ†เจฆ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจธเฉ€-เจ•เฉ‹เจก เจฆเฉ€ เจฎเฉเฉฑเจ– เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจ‡เจน เจนเฉˆ เจธเฉฐเจ–เฉ‡เจชเจคเจพ. เจ‡เจน เจ…เจ•เจธเจฐ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจฎเฉˆเจ‚ เจ†เจชเจฃเฉ€ เจธเจพเจˆเจŸ 'เจคเฉ‡ เจ‡เฉฑเจ• เจฎเฉเจ•เจพเจฌเจฒเจคเจจ เจคเฉฐเจ— เจกเจฟเจธเจชเจฒเฉ‡ เจ–เฉ‡เจคเจฐ เจจเฉ‚เฉฐ เจซเจฟเฉฑเจŸ เจ•เจฐเจจ เจฒเจˆ เจตเจฟเจ†เจชเจ• เจธเฉฐเจชเจพเจฆเจจ เจฆเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ•เฉ‹เจก เจฆเฉ‡ เจŸเฉเจ•เฉœเฉ‡ เจธเจผเจพเจฎเจฒ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเจพเจ‚.

เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš /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 เจซเจพเจˆเจฒเจพเจ‚ เจฒเจˆ, เจ‰เจน เจ‡เจธเจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐเฉ€ เจนเจจ inode เจซเจฒเฉˆเจ— 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 เจฏเฉ‚เจœเจผเจฐ เจฏเฉ‚ยป เจ…เจคเฉ‡ เจฐเจœเจฟเจธเจŸเจฐ R0 ะธ R1 เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจ…เจคเฉ‡ เจตเจพเจชเจธเฉ€ เจฎเฉเฉฑเจฒ เจชเจพเจธ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค

เจฆเฉ‡ เจจเจพเจฒ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ ialloc() เจกเจฟเจธเจ• 'เจคเฉ‡ เจชเจพเจ“ เจ†เจˆเจจเฉ‹เจก (เจ‡เฉฐเจกเฉˆเจ•เจธ เจนเฉˆเจ‚เจกเจฒ), เจ…เจคเฉ‡ เจฎเจฆเจฆ เจจเจพเจฒ falloc() - เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจตเจฟเฉฑเจš เจฆเฉ‹ เจฐเฉฑเจ–เฉ‹ เจซเจพเจˆเจฒ. เจœเฉ‡เจ•เจฐ เจธเจญ เจ•เฉเจ เจ เฉ€เจ• เจฐเจฟเจนเจพ, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ‡เจนเจจเจพเจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฆเฉ‡ เจฆเฉ‹ เจธเจฟเจฐเจฟเจ†เจ‚ เจตเจœเฉ‹เจ‚ เจชเจ›เจพเจฃเจจ เจฒเจˆ เจซเจฒเฉˆเจ— เจธเฉˆเจŸ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจธเฉ‡ เจ†เจˆเจจเฉ‹เจก (เจœเจฟเจธ เจฆเฉ€ เจธเฉฐเจฆเจฐเจญ เจ—เจฟเจฃเจคเฉ€ 2 'เจคเฉ‡ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€) เจตเฉฑเจฒ เจ‡เจธเจผเจพเจฐเจพ เจ•เจฐเจพเจ‚เจ—เฉ‡, เจ…เจคเฉ‡ เจ†เจˆเจจเฉ‹เจก เจจเฉ‚เฉฐ เจธเฉ‹เจงเฉ‡ เจนเฉ‹เจ เจ…เจคเฉ‡ เจตเจฐเจคเฉ‹เจ‚ เจตเจฟเฉฑเจš เจฎเจพเจฐเจ• เจ•เจฐเฉ‹เจ—เฉ‡เฅค เจฆเฉ€เจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจตเฉฑเจฒ เจงเจฟเจ†เจจ เจฆเจฟเจ“ เจฎเฉˆเจ‚ เจชเจพเจ‡เจ†() เจจเจตเฉ‡เจ‚ เจ†เจˆเจจเฉ‹เจก เจตเจฟเฉฑเจš เจธเฉฐเจฆเจฐเจญ เจ—เจฟเจฃเจคเฉ€ เจจเฉ‚เฉฐ เจ˜เจŸเจพเจ‰เจฃ เจฒเจˆ เจ—เจฒเจคเฉ€ เจฎเจพเจฐเจ—เจพเจ‚ เจตเจฟเฉฑเจšเฅค

pipe() เจฆเฉเจ†เจฐเจพ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ R0 ะธ R1 เจชเฉœเฉเจนเจจ เจ…เจคเฉ‡ เจฒเจฟเจ–เจฃ เจฒเจˆ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจจเฉฐเจฌเจฐ เจตเจพเจชเจธ เจ•เจฐเฉ‹เฅค falloc() เจซเจพเจˆเจฒ เจขเจพเจ‚เจšเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจชเฉเจ†เจ‡เฉฐเจŸเจฐ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจฐเจพเจนเฉ€เจ‚ "เจตเจพเจชเจธเฉ€" เจตเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ u.u_ar0[R0] เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐเฅค เจญเจพเจต, เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจฌเจšเจฆเจพ เจนเฉˆ r เจชเฉœเฉเจนเจจ เจฒเจˆ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจ…เจคเฉ‡ เจธเจฟเฉฑเจงเฉ‡ เจคเฉ‹เจ‚ เจฒเจฟเจ–เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจฆเจพ เจนเฉˆ u.u_ar0[R0] เจฆเฉ‚เจœเฉ€ เจ•เจพเจฒ เจฆเฉ‡ เจฌเจพเจ…เจฆ falloc().

เจซเจฒเฉˆเจ— FPIPE, เจœเฉ‹ เจ…เจธเฉ€เจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฌเจฃเจพเจ‰เจฃ เจตเฉ‡เจฒเฉ‡ เจธเฉˆเจŸ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ‡ เจตเจฟเจตเจนเจพเจฐ เจจเฉ‚เฉฐ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ rdwr() sys2.c เจตเจฟเฉฑเจšเจ–เจพเจธ I/O เจฐเฉเจŸเฉ€เจจเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจจเจพ:

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

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

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

เจซเจฟเจฐ เจซเฉฐเจ•เจธเจผเจจ readp() ะฒ pipe.c เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจกเจพเจŸเจพ เจชเฉœเฉเจนเจฆเจพ เจนเฉˆเฅค เจชเจฐ เจ‡เจธ เจคเฉ‹เจ‚ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹ เจ•เฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃเจพ เจฌเจฟเจนเจคเจฐ เจนเฉˆ writep(). เจฆเฉเจฌเจพเจฐเจพ, เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เจฐเจจ เจฆเฉ‡ เจธเฉฐเจฎเฉ‡เจฒเจจเจพเจ‚ เจ•เจพเจฐเจจ เจ•เฉ‹เจก เจตเจงเฉ‡เจฐเฉ‡ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจฌเจฃ เจ—เจฟเจ† เจนเฉˆ, เจชเจฐ เจ•เฉเจ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ›เฉฑเจกเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

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

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

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

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

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

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

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

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

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

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

เจ…เจธเฉ€เจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจ‡เจจเจชเฉเจŸ 'เจคเฉ‡ เจฌเจพเจˆเจŸเจธ เจฒเจฟเจ–เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ u.u_count. เจชเจนเจฟเจฒเจพเจ‚ เจธเจพเจจเฉ‚เฉฐ เจ‡เจจเฉ‹เจก เจจเฉ‚เฉฐ เจฒเจพเจ• เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ (เจนเฉ‡เจ เจพเจ‚ เจฆเฉ‡เจ–เฉ‹ plock/prele).

เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจ‡เจจเฉ‹เจก เจฐเฉˆเจซเจฐเฉˆเจ‚เจธ เจ•เจพเจŠเจ‚เจŸเจฐ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจœเจฟเฉฐเจจเจพ เจšเจฟเจฐ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฆเฉ‡ เจฆเฉ‹เจตเฉ‡เจ‚ เจธเจฟเจฐเฉ‡ เจ–เฉเฉฑเจฒเฉเจนเฉ‡ เจฐเจนเจฟเฉฐเจฆเฉ‡ เจนเจจ, เจ•เจพเจŠเจ‚เจŸเจฐ 2 เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจฒเจฟเฉฐเจ• เจฐเฉฑเจ–เจฆเฉ‡ เจนเจพเจ‚ (เจคเฉ‹เจ‚ rp->f_inode), เจ‡เจธ เจฒเจˆ เจœเฉ‡เจ•เจฐ เจ•เจพเจŠเจ‚เจŸเจฐ 2 เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจธเจฆเจพ เจฎเจคเจฒเจฌ เจ‡เจน เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ•เจฟ เจฐเฉ€เจกเจฟเฉฐเจ— เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‡ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฆเฉ‡ เจ†เจชเจฃเฉ‡ เจ…เฉฐเจค เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจนเฉˆเฅค เจฆเฉ‚เจœเฉ‡ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจฌเฉฐเจฆ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจ‡เจน เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ เจนเฉˆเฅค เจชเจนเจฟเจฒเฉ€ เจตเจพเจฐ เจ—เจฒเจคเฉ€ เจ•เฉ‹เจก EPIPE เจ…เจคเฉ‡ เจธเจฟเจ—เจจเจฒ SIGPIPE เจฏเฉ‚เจจเจฟเจ•เจธ เจฆเฉ‡ เจ›เฉ‡เจตเฉ‡เจ‚ เจเจกเฉ€เจธเจผเจจ เจตเจฟเฉฑเจš เจชเฉเจฐเจ—เจŸ เจนเฉ‹เจ‡เจ†เฅค

เจชเจฐ เจญเจพเจตเฉ‡เจ‚ เจ•เจจเจตเฉ‡เจ…เจฐ เจ–เฉเฉฑเจฒเฉเจนเจพ เจนเฉˆ, เจ‡เจน เจญเจฐเจฟเจ† เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ. เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจฒเจพเจ• เจจเฉ‚เฉฐ เจ›เฉฑเจก เจฆเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‡เจธ เจ‰เจฎเฉ€เจฆ เจตเจฟเฉฑเจš เจธเฉŒเจ‚ เจœเจพเจ‚เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเฉ‡เจ—เฉ€ เจ…เจคเฉ‡ เจ‡เจธ เจตเจฟเฉฑเจš เจ•เจพเจซเจผเฉ€ เจœเจ—เฉเจนเจพ เจ–เจพเจฒเฉ€ เจ•เจฐ เจฆเฉ‡เจตเฉ‡เจ—เฉ€เฅค เจœเจพเจ—เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ…เจธเฉ€เจ‚ เจธเจผเฉเจฐเฉ‚เจ†เจค 'เจคเฉ‡ เจตเจพเจชเจธ เจ†เจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚, เจฒเจพเจ• เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจฒเจŸเจ•เจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจฐเจฟเจ•เจพเจฐเจกเจฟเฉฐเจ— เจšเฉฑเจ•เจฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

เจœเฉ‡เจ•เจฐ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจตเจฟเฉฑเจš เจ•เจพเจซเจผเฉ€ เจ–เจพเจฒเฉ€ เจฅเจพเจ‚ เจนเฉˆ, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจกเฉ‡เจŸเจพ เจฒเจฟเจ–เจฆเฉ‡ เจนเจพเจ‚ เจฒเจฟเจ–เฉ‹ (). เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ i_size1 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() เจ…เจคเฉ‡ writei() เจ‡เจน เจธเจฎเจเจฃ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ€ เจฎเจฆเจฆ เจ•เจฐเฉ‡เจ—เจพ เจ•เจฟ เจฎเจพเจชเจฆเฉฐเจกเจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เจฐเจจ เจฆเฉ€ เจฌเจœเจพเจ "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), เจœเฉ‹ เจกเฉˆเฉฑเจกเจฒเจพเจ• เจฆเฉ€ เจ…เจ—เจตเจพเจˆ เจ•เจฐเจฆเจพ เจนเฉˆ if readp() เจ…เจœเฉ‡ เจคเฉฑเจ• เจฎเฉ‡เจฐเฉ‡ เจฌเจฒเจพเจ• เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจนเจŸเจพเจ‡เจ† เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจ•เจฟเจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเจนเฉ€ เจขเฉฐเจ— เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ. เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเฉ‹ wakeup(), เจซเจฟเจฐ เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจธเจฟเจฐเจซ เจธเจฒเฉ€เจชเจฟเฉฐเจ— เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจคเจฟเจ†เจฐ เจตเจœเฉ‹เจ‚ เจšเจฟเฉฐเจจเฉเจนเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจœเฉ‹ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš sched() เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เจธ เจจเฉ‚เฉฐ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ. เจ‡เจธ เจฒเจˆ readp() เจ•เจพเจฐเจจ wakeup(), เจฒเจพเจ• เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจธเฉˆเฉฑเจŸ เจ•เจฐเจฆเจพ เจนเฉˆ IREAD เจ…เจคเฉ‡ เจ•เจพเจฒเจพเจ‚ sleep(ip+2)- เจ‡เจน เจธเจญ เจชเจนเจฟเจฒเจพเจ‚ writep() เจšเฉฑเจ•เจฐ เจฎเฉเฉœ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ‡เจน เจ›เฉ‡เจตเฉ‡เจ‚ เจเจกเฉ€เจธเจผเจจ เจตเจฟเฉฑเจš เจ•เจจเจตเฉ‡เจ…เจฐเจพเจ‚ เจฆเฉ‡ เจตเจฐเจฃเจจ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจธเจงเจพเจฐเจจ เจ•เฉ‹เจก, เจฆเฉ‚เจฐเจ—เจพเจฎเฉ€ เจจเจคเฉ€เจœเฉ‡เฅค

เจฏเฉ‚เจจเจฟเจ•เจธ เจฆเจพ เจธเฉฑเจคเจตเจพเจ‚ เจเจกเฉ€เจธเจผเจจ (เจœเจจเจตเจฐเฉ€ 1979) เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจชเฉเจฐเจฎเฉเฉฑเจ– เจฐเฉ€เจฒเฉ€เจœเจผ เจธเฉ€ (เจšเจพเจฐ เจธเจพเจฒ เจฌเจพเจ…เจฆ) เจœเจฟเจธ เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจจเจตเฉ€เจ†เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจชเฉ‡เจธเจผ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚เฅค เจ‡เจธ เจตเจฟเฉฑเจš เจŸเจพเจˆเจช เจ•เจพเจธเจŸเจฟเฉฐเจ—, เจฏเฉ‚เจจเฉ€เจ…เจจเจพเจ‚ เจ…เจคเฉ‡ เจŸเจพเจˆเจช เจ•เฉ€เจคเฉ‡ เจชเฉเจ†เจ‡เฉฐเจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฃเจคเจฐเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฆเฉ‡ เจธเจฌเฉฐเจง เจตเจฟเฉฑเจš เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจตเฉ€ เจ†เจˆเจ†เจ‚เฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ•เจจเจตเฉ‡เจ…เจฐ เจ•เฉ‹เจก เจ…เจฎเจฒเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจฌเจฆเจฒเจฟเจ† เจจเจนเฉ€เจ‚เฅค เจ…เจธเฉ€เจ‚ เจ‡เจธ เจธเฉฐเจธเจ•เจฐเจจ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจธเจ•เจฆเฉ‡ เจนเจพเจ‚เฅค

Xv6, เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจฏเฉ‚เจจเจฟเจ•เจธ เจตเจฐเจ—เจพ เจ•เจฐเจจเจฒ

เจ•เจฐเจจเจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ Xv6 เจฏเฉ‚เจจเจฟเจ•เจธ เจฆเฉ‡ เจ›เฉ‡เจตเฉ‡เจ‚ เจเจกเฉ€เจธเจผเจจ เจคเฉ‹เจ‚ เจชเฉเจฐเจญเจพเจตเจฟเจค เจนเฉˆ, เจชเจฐ เจ‡เจน x86 เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐเจพเจ‚ 'เจคเฉ‡ เจšเฉฑเจฒเจฃ เจฒเจˆ เจ†เจงเฉเจจเจฟเจ• C เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค เจ•เฉ‹เจก เจชเฉœเฉเจนเจจ เจ…เจคเฉ‡ เจธเจฎเจเจฃ เจตเจฟเฉฑเจš เจ†เจธเจพเจจ เจนเฉˆเฅค เจจเจพเจฒ เจนเฉ€, TUHS เจจเจพเจฒ เจฏเฉ‚เจจเจฟเจ•เจธ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ‡ เจ‰เจฒเจŸ, เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‡เจธเจจเฉ‚เฉฐ เจธเฉ‹เจง เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ PDP 11/70 เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ เจ•เจฟเจธเฉ‡ เจนเฉ‹เจฐ เจšเฉ€เจœเจผ 'เจคเฉ‡ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจ‡เจธ เจฒเจˆ, เจ‡เจน เจ•เจฐเจจเจฒ เจฏเฉ‚เจจเฉ€เจตเจฐเจธเจฟเจŸเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎเจพเจ‚ 'เจคเฉ‡ เจตเจฟเจฆเจฟเจ…เจ• เจธเจฎเฉฑเจ—เจฐเฉ€ เจตเจœเฉ‹เจ‚ เจตเจฟเจ†เจชเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจธเจฐเฉ‹เจค Github 'เจคเฉ‡ เจนเจจ.

เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจชเจธเจผเจŸ เจ…เจคเฉ‡ เจตเจฟเจšเจพเจฐเจธเจผเฉ€เจฒ เจฒเจพเจ—เฉ‚เจ•เจฐเจจ เจธเจผเจพเจฎเจฒ เจนเฉˆ เจชเจพเจˆเจช.เจธเฉ€, เจกเจฟเจธเจ• เจ‰เฉฑเจคเฉ‡ เจ‡เฉฑเจ• inode เจฆเฉ€ เจฌเจœเจพเจ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฌเจซเจฐ เจฆเฉเจ†เจฐเจพ เจธเจฎเจฐเจฅเจฟเจค เจนเฉˆเฅค เจ‡เฉฑเจฅเฉ‡ เจฎเฉˆเจ‚ เจธเจฟเจฐเจซ "เจขเจพเจ‚เจšเจพเจ—เจค เจชเจพเจˆเจชเจฒเจพเจˆเจจ" เจ…เจคเฉ‡ เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเจพเจ‚ 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

เจฒเฉ€เจจเจ•เจธ 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 เจ‡เฉฐเจจเจพ เจชเจฐเจฆเฉ‡เจธเฉ€ เจจเจนเฉ€เจ‚ เจฒเฉฑเจ—เจฆเจพเฅค

เจ†เจงเฉเจจเจฟเจ• เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ, เจซเฉเจฐเฉ€เจฌเฉ€เจเจธเจกเฉ€, เจจเฉˆเฉฑเจŸเจฌเฉ€เจเจธเจกเฉ€, เจ“เจชเจจเจฌเฉ€เจเจธเจกเฉ€

เจฎเฉˆเจ‚ เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจ•เฉเจ เจ†เจงเฉเจจเจฟเจ• เจ•เจฐเจจเจฒเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฒเฉฐเจ˜เจฟเจ†เฅค เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ•เจฟเจธเฉ‡ เจ•เฉ‹เจฒ เจตเฉ€ เจนเฉเจฃ เจกเจฟเจธเจ• เจฒเจพเจ—เฉ‚ เจจเจนเฉ€เจ‚ เจนเฉˆ (เจนเฉˆเจฐเจพเจจเฉ€ เจตเจพเจฒเฉ€ เจ—เฉฑเจฒ เจจเจนเฉ€เจ‚)เฅค เจฒเฉ€เจจเจ•เจธ เจฆเจพ เจ†เจชเจฃเจพ เจฒเจพเจ—เฉ‚เจ•เจฐเจจ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ เจคเจฟเฉฐเจจ เจ†เจงเฉเจจเจฟเจ• BSD เจ•เจฐเจจเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจ•เฉ‹เจก เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡ เจฒเจพเจ—เฉ‚เจ•เจฐเจจ เจธเจผเจพเจฎเจฒ เจนเจจ เจœเฉ‹ เจœเฉŒเจจ เจกเจพเจ‡เจธเจจ เจฆเฉเจ†เจฐเจพ เจฒเจฟเจ–เฉ‡ เจ—เจ เจธเจจ, เจธเจพเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจ‰เจน เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจคเฉ‹เจ‚ เจฌเจนเฉเจค เจตเฉฑเจ–เจฐเฉ‡ เจนเฉ‹ เจ—เจ เจนเจจเฅค

เจชเฉœเฉเจนเจจ เจฒเจˆ fs/pipe.c (เจฒเฉ€เจจเจ•เจธ เจ‰เฉฑเจคเฉ‡) เจœเจพเจ‚ sys/kern/sys_pipe.c (*BSD เจ‰เฉฑเจคเฉ‡), เจ‡เจธ เจจเฉ‚เฉฐ เจ…เจธเจฒ เจธเจฎเจฐเจชเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ…เฉฑเจœ เจฆเจพ เจ•เฉ‹เจก เจตเฉˆเจ•เจŸเจฐ เจ…เจคเฉ‡ เจ…เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจธ I/O เจตเจฐเจ—เฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฒเจˆ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจ…เจคเฉ‡ เจธเจฎเจฐเจฅเจจ เจฌเจพเจฐเฉ‡ เจนเฉˆเฅค เจ…เจคเฉ‡ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจตเฉฐเจก, เจคเจพเจฒเฉ‡ เจ…เจคเฉ‡ เจ•เจฐเจจเจฒ เจธเฉฐเจฐเจšเจจเจพ เจฆเฉ‡ เจตเฉ‡เจฐเจตเฉ‡ เจฌเจนเฉเจค เจตเฉฑเจ–เจฐเฉ‡ เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค เจ‡เจน เจ‰เจน เจจเจนเฉ€เจ‚ เจนเฉˆ เจœเฉ‹ เจ•เจพเจฒเจœเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจ•เฉ‹เจฐเจธ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจนเฉˆเฅค

เจตเฉˆเจธเฉ‡ เจตเฉ€, เจฎเฉˆเจ‚ เจ•เฉเจ เจชเฉเจฐเจพเจฃเฉ‡ เจชเฉˆเจŸเจฐเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ–เฉ‹เจฆเจฃ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเจพ เจธเฉ€ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจชเฉˆเจฆเจพ เจ•เจฐเจจเจพ SIGPIPE เจ…เจคเฉ‡ เจตเจพเจชเจธเฉ€ EPIPE เจ‡เฉฑเจ• เจฌเฉฐเจฆ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจตเฉ‡เจฒเฉ‡) เจ‡เจนเจจเจพเจ‚ เจธเจพเจฐเฉ‡ เจตเฉฑเจ–-เจตเฉฑเจ– เจ†เจงเฉเจจเจฟเจ• เจ•เจฐเจจเจฒเจพเจ‚ เจตเจฟเฉฑเจšเฅค เจฎเฉˆเจ‚ เจธเจผเจพเจ‡เจฆ เจ…เจธเจฒ เจœเฉ€เจตเจจ เจตเจฟเฉฑเจš เจ•เจฆเฉ‡ เจตเฉ€ PDP-11 เจ•เฉฐเจชเจฟเจŠเจŸเจฐ เจจเจนเฉ€เจ‚ เจฆเฉ‡เจ–เจพเจ‚เจ—เจพ, เจชเจฐ เจฎเฉ‡เจฐเฉ‡ เจœเจจเจฎ เจคเฉ‹เจ‚ เจ•เจˆ เจธเจพเจฒ เจชเจนเจฟเจฒเจพเจ‚ เจฒเจฟเจ–เฉ‡ เจ—เจ เจ•เฉ‹เจก เจคเฉ‹เจ‚ เจธเจฟเฉฑเจ–เจฃ เจฒเจˆ เจ…เจœเฉ‡ เจตเฉ€ เจฌเจนเฉเจค เจ•เฉเจ เจนเฉˆเฅค

เจฆเจฟเจตเฉ€ เจ•เจชเฉ‚เจฐ เจฆเฉเจ†เจฐเจพ 2011 เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจ‡เฉฑเจ• เจฒเฉ‡เจ–:เจชเจพเจˆเจชเจพเจ‚ เจ…เจคเฉ‡ FIFOs เจฆเจพ เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ" เจฒเฉ€เจจเจ•เจธ เจตเจฟเฉฑเจš เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ (เจ…เจœเฉ‡ เจตเฉ€) เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ เจฌเจพเจฐเฉ‡ เจ‡เฉฑเจ• เจธเฉฐเจ–เฉ‡เจช เจœเจพเจฃเจ•เจพเจฐเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ เจฒเฉ€เจจเจ•เจธ เจตเจฟเฉฑเจš เจคเจพเจœเจผเจพ เจชเฉเจฐเจคเฉ€เจฌเฉฑเจงเจคเจพ เจชเจฐเจธเจชเจฐ เจ•เฉเจฐเจฟเจ† เจฆเฉ‡ เจ‡เฉฑเจ• เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจฎเจพเจกเจฒ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจœเจฟเจธเจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ เจ…เจธเจฅเจพเจˆ เจซเจพเจˆเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจตเฉฑเจง เจนเฉˆ; เจ…เจคเฉ‡ เจ‡เจน เจตเฉ€ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจ›เฉ‡เจตเฉ‡เจ‚ เจเจกเฉ€เจธเจผเจจ เจฏเฉ‚เจจเจฟเจ•เจธ เจ•เจฐเจจเจฒ เจฆเฉ‡ "เจฌเจนเฉเจค เจฐเฉ‚เฉœเฉ€เจตเจพเจฆเฉ€ เจฒเจพเจ•เจฟเฉฐเจ—" เจคเฉ‹เจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจ•เจฟเฉฐเจจเฉ€ เจฆเฉ‚เจฐ เจ†เจˆเจ†เจ‚ เจนเจจเฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹