ΠΠ²Π°Ρ ΡΠ»Π°Π½Π°ΠΊ ΠΎΠΏΠΈΡΡΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° Ρ Π£Π½ΠΈΠΊ ΠΊΠ΅ΡΠ½Π΅Π»Ρ. ΠΠΈΠΎ ΡΠ°ΠΌ ΠΏΠΎΠΌΠ°Π»ΠΎ ΡΠ°Π·ΠΎΡΠ°ΡΠ°Π½ ΡΡΠΎ ΡΠ΅ Π½Π΅Π΄Π°Π²Π½ΠΈ ΡΠ»Π°Π½Π°ΠΊ ΠΏΠΎΠ΄ Π½Π°ΡΠ»ΠΎΠ²ΠΎΠΌ "
Π¨ΡΠ° Π³ΠΎΠ²ΠΎΡΠΈΠΌΠΎ?
Π¦Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ, βΠ²Π΅ΡΠΎΠ²Π°ΡΠ½ΠΎ Π½Π°ΡΠ²Π°ΠΆΠ½ΠΈΡΠΈ ΠΏΡΠΎΠ½Π°Π»Π°Π·Π°ΠΊ Ρ Π£Π½ΠΈΠΊ-Ρ,β ΡΡ Π΄Π΅ΡΠΈΠ½ΠΈΡΡΡΠ° ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° ΠΎΡΠ½ΠΎΠ²Π½Π΅ Π£Π½ΠΈΠΊ ΡΠΈΠ»ΠΎΠ·ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠ²Π΅Π·ΠΈΠ²Π°ΡΠ° ΠΌΠ°Π»ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π°ΡΠ΅Π΄Π½ΠΎ, ΠΊΠ°ΠΎ ΠΈ ΠΏΠΎΠ·Π½Π°ΡΠΈ Π·Π½Π°ΠΊ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΡ Π»ΠΈΠ½ΠΈΡΠΈ:
$ echo hello | wc -c
6
ΠΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΎΠ³ ΠΏΠΎΠ·ΠΈΠ²Π° ΠΊΠΎΡΠΈ ΠΎΠ±Π΅Π·Π±Π΅ΡΡΡΠ΅ ΠΊΠ΅ΡΠ½Π΅Π» pipe
, ΡΡΠΎ ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅
Π¦Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ ΠΎΠ±Π΅Π·Π±Π΅ΡΡΡΡ ΡΠ΅Π΄Π½ΠΎΡΠΌΠ΅ΡΠ½ΠΈ ΠΊΠ°Π½Π°Π» Π·Π° ΠΌΠ΅ΡΡΠΏΡΠΎΡΠ΅ΡΠ½Ρ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΡ. Π¦ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ ΠΈΠΌΠ° ΡΠ»Π°Π· (ΠΊΡΠ°Ρ Π·Π° ΡΠΏΠΈΡΠΈΠ²Π°ΡΠ΅) ΠΈ ΠΈΠ·Π»Π°Π· (ΠΊΡΠ°Ρ Π·Π° ΡΠΈΡΠ°ΡΠ΅). ΠΠΎΠ΄Π°ΡΠΈ ΡΠΏΠΈΡΠ°Π½ΠΈ Π½Π° ΡΠ»Π°Π· ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° ΠΌΠΎΠ³Ρ ΡΠ΅ ΡΠΈΡΠ°ΡΠΈ Π½Π° ΠΈΠ·Π»Π°Π·Ρ.
Π¦ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ ΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ° ΠΏΠΎΠΌΠΎΡΡ ΠΏΠΎΠ·ΠΈΠ²Π°
pipe(2)
, ΠΊΠΎΡΠΈ Π²ΡΠ°ΡΠ° Π΄Π²Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅: ΡΠ΅Π΄Π°Π½ ΡΠ΅ ΠΎΠ΄Π½ΠΎΡΠΈ Π½Π° ΡΠ»Π°Π· ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π°, Π΄ΡΡΠ³ΠΈ Π½Π° ΠΈΠ·Π»Π°Π·.
ΠΠ·Π»Π°Π· ΠΏΡΠ°ΡΠ΅ΡΠ° ΠΈΠ· Π³ΠΎΡΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΏΠΎΠΊΠ°Π·ΡΡΠ΅ ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° ΠΈ ΠΏΡΠΎΡΠΎΠΊ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΊΡΠΎΠ· ΡΠ΅Π³Π° ΠΎΠ΄ ΡΠ΅Π΄Π½ΠΎΠ³ ΠΏΡΠΎΡΠ΅ΡΠ° Π΄ΠΎ Π΄ΡΡΠ³ΠΎΠ³:
$ strace -qf -e execve,pipe,dup2,read,write
sh -c 'echo hello | wc -c'
execve("/bin/sh", ["sh", "-c", "echo hello | wc -c"], β¦)
pipe([3, 4]) = 0
[pid 2604795] dup2(4, 1) = 1
[pid 2604795] write(1, "hellon", 6) = 6
[pid 2604796] dup2(3, 0) = 0
[pid 2604796] execve("/usr/bin/wc", ["wc", "-c"], β¦)
[pid 2604796] read(0, "hellon", 16384) = 6
[pid 2604796] write(1, "6n", 2) = 2
Π ΠΎΠ΄ΠΈΡΠ΅ΡΡΠΊΠΈ ΠΏΡΠΎΡΠ΅Ρ ΠΏΠΎΠ·ΠΈΠ²Π° pipe()
Π΄Π° Π΄ΠΎΠ±ΠΈΡΠ΅ΡΠ΅ ΠΌΠΎΠ½ΡΠΈΡΠ°Π½Π΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°. ΠΠ΅Π΄Π°Π½ ΠΏΠΎΠ΄ΡΠ΅ΡΠ΅Π½ΠΈ ΠΏΡΠΎΡΠ΅Ρ ΡΠΏΠΈΡΡΡΠ΅ Ρ ΡΠ΅Π΄Π½Ρ ΡΡΡΠΊΡ, Π° Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΡΠ΅Ρ ΡΠΈΡΠ° ΠΈΡΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ ΠΈΠ· Π΄ΡΡΠ³Π΅ ΡΡΡΠΊΠ΅. Π‘Ρ
Π΅Π»Π» ΠΊΠΎΡΠΈΡΡΠΈ Π΄ΡΠΏ2 Π΄Π° βΠΏΡΠ΅ΠΈΠΌΠ΅Π½ΡΡΠ΅β Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅ 3 ΠΈ 4 Π΄Π° Π±ΠΈ ΡΠ΅ ΡΡΠΊΠ»Π°Π΄ΠΈΠ»ΠΈ ΡΠ° ΡΡΠ΄ΠΈΠ½ ΠΈ ΡΡΠ΄ΠΎΡΡ.
ΠΠ΅Π· ΡΠ΅Π²ΠΈ, ΡΡΡΠΊΠ° Π±ΠΈ ΠΌΠΎΡΠ°Π»Π° Π΄Π° Π·Π°ΠΏΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΡΠ΅Π΄Π½ΠΎΠ³ ΠΏΡΠΎΡΠ΅ΡΠ° Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ ΠΈ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈ Π³Π° Π΄ΡΡΠ³ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡ Π΄Π° ΠΏΡΠΎΡΠΈΡΠ° ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ ΠΈΠ· Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅. ΠΠ°ΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ ΡΠΎΠ³Π°, ΡΡΠΎΡΠΈΠ»ΠΈ Π±ΠΈΡΠΌΠΎ Π²ΠΈΡΠ΅ ΡΠ΅ΡΡΡΡΠ° ΠΈ ΠΏΡΠΎΡΡΠΎΡΠ° Π½Π° Π΄ΠΈΡΠΊΡ. ΠΠ΅ΡΡΡΠΈΠΌ, ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ ΡΡ Π΄ΠΎΠ±ΡΠΈ Π½Π΅ ΡΠ°ΠΌΠΎ Π·Π°ΡΠΎ ΡΡΠΎ Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡΡΠ°Π²Π°ΡΡ Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΡΠ΅ ΡΠΏΠΎΡΡΠ΅Π±Ρ ΠΏΡΠΈΠ²ΡΠ΅ΠΌΠ΅Π½ΠΈΡ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°:
ΠΠΊΠΎ ΠΏΡΠΎΡΠ΅Ρ ΠΏΠΎΠΊΡΡΠ°Π²Π° Π΄Π° ΡΠΈΡΠ° ΠΈΠ· ΠΏΡΠ°Π·Π½ΠΎΠ³ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° ΠΎΠ½Π΄Π°
read(2)
ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠΈ Π΄ΠΎΠΊ ΠΏΠΎΠ΄Π°ΡΠΈ Π½Π΅ ΠΏΠΎΡΡΠ°Π½Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΈ. ΠΠΊΠΎ ΠΏΡΠΎΡΠ΅Ρ ΠΏΠΎΠΊΡΡΠ° Π΄Π° ΡΠΏΠΈΡΠ΅ Ρ ΡΠ΅ΠΎ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄, ΠΎΠ½Π΄Π°write(2)
ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠΈ ΡΠ²Π΅ Π΄ΠΎΠΊ ΡΠ΅ ΠΈΠ· ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° Π½Π΅ ΠΏΡΠΎΡΠΈΡΠ° Π΄ΠΎΠ²ΠΎΡΠ½ΠΎ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Π·Π° ΡΠΏΠΈΡΠΈΠ²Π°ΡΠ΅.
ΠΠ°ΠΎ ΠΈ Π·Π°Ρ
ΡΠ΅Π² ΠΠΠ‘ΠΠΠ‘, ΠΎΠ²ΠΎ ΡΠ΅ Π²Π°ΠΆΠ½ΠΎ ΡΠ²ΠΎΡΡΡΠ²ΠΎ: ΠΏΠΈΡΠ°ΡΠ΅ Ρ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ Π΄ΠΎ PIPE_BUF
Π±Π°ΡΡΠΎΠ²ΠΈ (Π½Π°ΡΠΌΠ°ΡΠ΅ 512) ΠΌΠΎΡΠ°ΡΡ Π±ΠΈΡΠΈ Π°ΡΠΎΠΌΡΠΊΠΈ ΠΊΠ°ΠΊΠΎ Π±ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ ΠΌΠΎΠ³Π»ΠΈ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°ΡΡ ΡΠ΅Π΄Π½ΠΈ ΡΠ° Π΄ΡΡΠ³ΠΈΠΌΠ° ΠΊΡΠΎΠ· ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ Π½Π° Π½Π°ΡΠΈΠ½ Π½Π° ΠΊΠΎΡΠΈ ΠΎΠ±ΠΈΡΠ½ΠΈ ΡΠ°ΡΠ»ΠΎΠ²ΠΈ (ΠΊΠΎΡΠΈ Π½Π΅ ΠΏΡΡΠΆΠ°ΡΡ ΡΠ°ΠΊΠ²Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΠ΅) Π½Π΅ ΠΌΠΎΠ³Ρ.
ΠΠ°Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΎΠ±ΠΈΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, ΠΏΡΠΎΡΠ΅Ρ ΠΌΠΎΠΆΠ΅ Π·Π°ΠΏΠΈΡΠ°ΡΠΈ ΡΠ°Π² ΡΠ²ΠΎΡ ΠΈΠ·Π»Π°Π· Ρ ΡΠ΅Π³Π° ΠΈ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈΡΠΈ Π³Π° Π΄ΡΡΠ³ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡ. ΠΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ ΠΌΠΎΠ³Ρ Π΄Π° ΡΠ°Π΄Π΅ Ρ Π²Π΅ΠΎΠΌΠ° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΡ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ ΡΠΏΠΎΡΠ½ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·Π°ΡΠΈΡΠ΅ (ΠΏΠΎΠΏΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°) Π΄Π° ΠΎΠ±Π°Π²Π΅ΡΡΠ°Π²Π°ΡΡ ΡΠ΅Π΄Π½ΠΈ Π΄ΡΡΠ³Π΅ ΠΊΠ°Π΄Π° ΡΠ΅ ΡΠΏΠΈΡΠΈΠ²Π°ΡΠ΅ ΠΈΠ»ΠΈ ΡΠΈΡΠ°ΡΠ΅ Π·Π°Π²ΡΡΠΈ. Π’ΡΠ°Π½ΡΠΏΠΎΡΡΠ΅ΡΠΈ Π½Π°Ρ ΡΠΏΠ°ΡΠ°Π²Π°ΡΡ ΠΎΠ΄ ΡΠ²ΠΈΡ ΠΎΠ²ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°.
Π¨ΡΠ° ΡΡΠ°ΠΆΠΈΠΌΠΎ?
ΠΠ±ΡΠ°ΡΠ½ΠΈΡΡ ΡΠΎ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΈΠΌ ΡΠ΅ΡΠΈΠΌΠ° ΡΠ°ΠΊΠΎ Π΄Π° Π²Π°ΠΌ Π±ΡΠ΄Π΅ Π»Π°ΠΊΡΠ΅ Π΄Π° Π·Π°ΠΌΠΈΡΠ»ΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ΅. ΠΠΎΡΠ°ΡΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π±Π°ΡΠ΅Ρ ΠΈ Π½Π΅ΠΊΠΎ ΡΡΠ°ΡΠ΅ Ρ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠΈ. ΠΠΈΡΠ΅ Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±Π½Π΅ ΡΡΠ½ΠΊΡΠΈΡΠ΅ Π·Π° Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ ΠΈ ΡΠΊΠ»Π°ΡΠ°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΈΠ· Π±Π°ΡΠ΅ΡΠ°. ΠΠΈΡΠ΅ Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±Π½Π° Π½Π΅ΠΊΠ° ΡΡΠ΅Π΄ΡΡΠ²Π° Π·Π° ΠΏΠΎΠ·ΠΈΠ²Π°ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠ° ΡΠΎΠΊΠΎΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠ° ΡΠΈΡΠ°ΡΠ° ΠΈ ΠΏΠΈΡΠ°ΡΠ° Π½Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈΠΌΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°. Π Π±ΠΈΡΠ΅ Π²Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±Π½Π΅ Π±ΡΠ°Π²Π΅ Π΄Π° Π±ΠΈΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΏΠΎΡΠ΅Π±Π½ΠΎ ΠΏΠΎΠ½Π°ΡΠ°ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΠΈΠ·Π½Π°Π΄.
Π‘Π°Π΄Π° ΡΠΌΠΎ ΡΠΏΡΠ΅ΠΌΠ½ΠΈ Π΄Π° ΠΈΡΠΏΠΈΡΠ°ΠΌΠΎ ΠΈΠ·Π²ΠΎΡΠ½ΠΈ ΠΊΠΎΠ΄ ΠΊΠ΅ΡΠ½Π΅Π»Π° ΠΏΠΎΠ΄ ΡΠ°ΠΊΠΈΠΌ ΡΠ²Π΅ΡΠ»ΠΎΠΌ Π»Π°ΠΌΠΏΠ΅ Π΄Π° Π±ΠΈΡΠΌΠΎ ΠΏΠΎΡΠ²ΡΠ΄ΠΈΠ»ΠΈ ΠΈΠ»ΠΈ ΠΎΠΏΠΎΠ²ΡΠ³Π»ΠΈ Π½Π°Ρ Π½Π΅ΡΠ°ΡΠ°Π½ ΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈ ΠΌΠΎΠ΄Π΅Π». ΠΠ»ΠΈ ΡΠ²Π΅ΠΊ Π±ΡΠ΄ΠΈΡΠ΅ ΡΠΏΡΠ΅ΠΌΠ½ΠΈ Π½Π° Π½Π΅ΠΎΡΠ΅ΠΊΠΈΠ²Π°Π½ΠΎ.
ΠΠ΄Π΅ ΡΡΠ°ΠΆΠΈΠΌΠΎ?
ΠΠ΅ Π·Π½Π°ΠΌ Π³Π΄Π΅ ΡΠ΅ ΠΌΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΊ ΡΡΠ²Π΅Π½Π΅ ΠΊΡΠΈΠ³Π΅β
ΠΡΡΠ°ΡΠ΅ ΠΊΡΠΎΠ· Π’Π£Π₯Π‘ Π°ΡΡ ΠΈΠ²Π΅ ΡΠ΅ ΠΊΠ°ΠΎ ΠΏΠΎΡΠ΅ΡΠ° ΠΌΡΠ·Π΅ΡΡ. ΠΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ Π½Π°ΡΡ Π·Π°ΡΠ΅Π΄Π½ΠΈΡΠΊΡ ΠΈΡΡΠΎΡΠΈΡΡ, ΠΈ ΠΏΠΎΡΡΡΡΠ΅ΠΌ Π΄ΡΠ³ΠΎΠ³ΠΎΠ΄ΠΈΡΡΠ΅ Π½Π°ΠΏΠΎΡΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π² ΠΎΠ²Π°Ρ ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π» ΠΏΠΎ ΠΌΠ°Π»ΠΎ ΠΏΠΎΠ²ΡΠ°ΡΠΈ ΡΠ° ΡΡΠ°ΡΠΈΡ ΡΡΠ°ΠΊΠ° ΠΈ ΠΎΡΠΈΡΠ°ΠΊΠ°. Π Π²Π΅ΠΎΠΌΠ° ΡΠ°ΠΌ ΡΠ²Π΅ΡΡΠ°Π½ ΡΠΈΡ ΡΡΠ°Π³ΠΌΠ΅Π½Π°ΡΠ° ΠΊΠΎΡΠΈ ΡΠΎΡ ΡΠ²Π΅ΠΊ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡ.
ΠΠΎΡΡΠΎ ΡΠΌΠΎ Π·Π°Π΄ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ Π½Π°ΡΡ ΡΠ°Π΄ΠΎΠ·Π½Π°Π»ΠΎΡΡ ΠΎ Π΄ΡΠ΅Π²Π½ΠΎΡ ΠΈΡΡΠΎΡΠΈΡΠΈ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅ΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ ΠΌΠΎΠ΄Π΅ΡΠ½Π° ΡΠ΅Π·Π³ΡΠ° Π·Π° ΠΏΠΎΡΠ΅ΡΠ΅ΡΠ΅.
Π£Π·Π³ΡΠ΅Π΄, pipe
ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ·ΠΈΠ² Π±ΡΠΎΡ 42 Ρ ΡΠ°Π±Π΅Π»ΠΈ sysent[]
. Π‘Π»ΡΡΠ°ΡΠ½ΠΎΡΡ?
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π°Π»Π½Π° Π£Π½ΠΈΠΊ ΡΠ΅Π·Π³ΡΠ° (1970β1974)
ΠΠΈΡΠ°ΠΌ Π½Π°ΡΠ°ΠΎ Π½ΠΈΠΊΠ°ΠΊΠ²Π΅ ΡΡΠ°Π³ΠΎΠ²Π΅ pipe(2)
ni u
Π’Π£Π₯Π‘ ΡΠΎ Π½Π°Π²ΠΎΠ΄ΠΈ
Π£Π½ΠΈΠΊ 1973ΡΠ΄ ΠΠ΄ΠΈΡΠΈΠΎΠ½ ΡΠ΅ Π±ΠΈΠ»Π° ΠΏΠΎΡΠ»Π΅Π΄ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° ΡΠ° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΠΌ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΌ Π½Π° Π°ΡΠ΅ΠΌΠ±Π»Π΅ΡΡΠΊΠΎΠΌ ΡΠ΅Π·ΠΈΠΊΡ, Π°Π»ΠΈ ΠΈ ΠΏΡΠ²Π° Π²Π΅ΡΠ·ΠΈΡΠ° ΡΠ° ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ΠΈΠΌΠ°. Π’ΠΎΠΊΠΎΠΌ XNUMX. Π³ΠΎΠ΄ΠΈΠ½Π΅ ΡΠ°Π΄ΠΈΠ»ΠΎ ΡΠ΅ Π½Π° ΠΏΠΎΠ±ΠΎΡΡΠ°ΡΡ ΡΡΠ΅ΡΠ΅Π³ ΠΈΠ·Π΄Π°ΡΠ°, ΠΊΠ΅ΡΠ½Π΅Π» ΡΠ΅ ΠΏΡΠ΅ΠΏΠΈΡΠ°Π½ Ρ Π¦, ΠΈ ΡΠ°ΠΊΠΎ ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΅ΡΠ²ΡΡΠΎ ΠΈΠ·Π΄Π°ΡΠ΅ Π£Π½ΠΈΠΊΠ°.
ΠΠ΅Π΄Π°Π½ ΡΠΈΡΠ°Π»Π°Ρ ΡΠ΅ ΠΏΡΠΎΠ½Π°ΡΠ°ΠΎ ΡΠΊΠ΅Π½ΠΈΡΠ°Π½ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Ρ ΠΊΠΎΡΠ΅ΠΌ ΡΠ΅ ΠΠ°Π³ ΠΠ΅ΠΊΠΈΠ»ΡΠΎΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠΎ ΠΈΠ΄Π΅ΡΡ βΠΏΠΎΠ²Π΅Π·ΠΈΠ²Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΏΠΎΠΏΡΡ Π±Π°ΡΡΠ΅Π½ΡΠΊΠΎΠ³ ΡΡΠ΅Π²Π°β.
Π£ ΠΊΡΠΈΠ·ΠΈ ΠΡΠ°ΡΠ°Π½Π° ΠΠ΅ΡΠ½ΠΈΠ³Π°Π½Π°
ΠΠ°Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈΠΎ Π£Π½ΠΈΠΊ, ΠΌΠΎΡΠ° ΡΠ°ΡΡΠΈΠ½Π°ΡΠΈΡΠ° ΠΊΠΎΡΡΡΠΈΠ½Π°ΠΌΠ° ΠΌΠ΅ ΡΠ΅ Π½Π°Π²Π΅Π»Π° Π΄Π° Π·Π°ΠΌΠΎΠ»ΠΈΠΌ Π°ΡΡΠΎΡΠ° ΠΠ‘-Π°, ΠΠ΅Π½Π° Π’ΠΎΠΌΠΏΡΠΎΠ½Π°, Π΄Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΠΏΠΎΠ΄Π°ΡΠΈ ΡΠΏΠΈΡΠ°Π½ΠΈ Ρ ΠΏΡΠΎΡΠ΅Ρ ΠΈΠ΄Ρ Π½Π΅ ΡΠ°ΠΌΠΎ Π½Π° ΡΡΠ΅ΡΠ°Ρ, Π²Π΅Ρ ΠΈ Π΄Π° ΠΈΠ·Π»Π°Π·Π΅ Ρ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΡΠ΅Ρ. ΠΠ΅Π½ ΡΠ΅ ΠΎΠ΄Π»ΡΡΠΈΠΎ Π΄Π° ΡΠ΅ ΡΠΎ ΠΌΠΎΠ³ΡΡΠ΅. ΠΠ΅ΡΡΡΠΈΠΌ, ΠΊΠ°ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΠ°, ΠΆΠ΅Π»Π΅ΠΎ ΡΠ΅ Π΄Π° ΡΠ²Π°ΠΊΠ° ΡΡΠ½ΠΊΡΠΈΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΈΠ³ΡΠ° Π·Π½Π°ΡΠ°ΡΠ½Ρ ΡΠ»ΠΎΠ³Ρ. ΠΠ° Π»ΠΈ ΡΠ΅ ΠΏΠΈΡΠ°ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΈΠ·ΠΌΠ΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΠ° Π·Π°ΠΈΡΡΠ° Π²Π΅Π»ΠΈΠΊΠ° ΠΏΡΠ΅Π΄Π½ΠΎΡΡ Ρ ΠΎΠ΄Π½ΠΎΡΡ Π½Π° ΠΏΠΈΡΠ°ΡΠ΅ Ρ ΠΏΠΎΡΡΠ΅Π΄Π½ΠΈ ΡΠ°ΡΠ»? Π’Π΅ΠΊ ΠΊΠ°Π΄Π° ΡΠ°ΠΌ Π΄Π°ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ°Π½ ΠΏΡΠ΅Π΄Π»ΠΎΠ³ ΡΠ° ΠΏΡΠΈΠ²Π»Π°ΡΠ½ΠΈΠΌ Π½Π°Π·ΠΈΠ²ΠΎΠΌ βΡΠ΅Π²ΠΎΠ²ΠΎΠ΄β ΠΈ ΠΎΠΏΠΈΡΠΎΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠ΅ Π·Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΡ ΠΈΠ·ΠΌΠ΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΠ°, ΠΠ΅Π½ ΡΠ΅ ΠΊΠΎΠ½Π°ΡΠ½ΠΎ ΡΠ·Π²ΠΈΠΊΠ½ΡΠΎ: βΠ£ΡΠ°Π΄ΠΈΡΡ ΡΠΎ!β
Π ΡΠ΅ΡΡΠ΅. ΠΠ΅Π΄Π½Π΅ ΠΊΠΎΠ±Π½Π΅ Π²Π΅ΡΠ΅ΡΠΈ, ΠΠ΅Π½ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΎ ΠΊΠ΅ΡΠ½Π΅Π» ΠΈ ΡΡΡΠΊΡ, ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΎ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΊΠ°ΠΊΠΎ Π±ΠΈ ΡΡΠ°Π½Π΄Π°ΡΠ΄ΠΈΠ·ΠΎΠ²Π°ΠΎ Π½Π°ΡΠΈΠ½ Π½Π° ΠΊΠΎΡΠΈ ΠΏΡΠΈΡ Π²Π°ΡΠ°ΡΡ ΡΠ½ΠΎΡ (ΠΊΠΎΡΠΈ Π±ΠΈ ΠΌΠΎΠ³Π°ΠΎ Π΄Π° Π΄ΠΎΡΠ΅ ΠΈΠ· ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π°), Π° ΡΠ°ΠΊΠΎΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠΎ ΠΈΠΌΠ΅Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°. Π‘Π»Π΅Π΄Π΅ΡΠ΅Π³ Π΄Π°Π½Π°, ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ ΡΡ ΠΏΠΎΡΠ΅Π»ΠΈ Π΄Π° ΡΠ΅ Π²Π΅ΠΎΠΌΠ° ΡΠΈΡΠΎΠΊΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ Ρ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΠΌΠ°. ΠΠΎ ΠΊΡΠ°ΡΠ° Π½Π΅Π΄Π΅ΡΠ΅, ΡΠ΅ΠΊΡΠ΅ΡΠ°ΡΠΈΡΠ΅ ΡΡ ΠΈΡ ΠΊΠΎΡΠΈΡΡΠΈΠ»Π΅ Π·Π° ΡΠ»Π°ΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½Π°ΡΠ° ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΎΠ±ΡΠ°Π΄Ρ ΡΠ΅ΠΊΡΡΠ° Ρ ΡΡΠ°ΠΌΠΏΠ°Ρ. ΠΠ΅ΡΡΠΎ ΠΊΠ°ΡΠ½ΠΈΡΠ΅, ΠΠ΅Π½ ΡΠ΅ Π·Π°ΠΌΠ΅Π½ΠΈΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈ ΠΠΠ ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΡ Π·Π° ΡΠΌΠΎΡΠ°Π²Π°ΡΠ΅ ΡΠΏΠΎΡΡΠ΅Π±Π΅ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° ΡΠΈΡΡΠΈΡΠΈΠΌ ΠΊΠΎΠ½Π²Π΅Π½ΡΠΈΡΠ°ΠΌΠ°, ΠΊΠΎΡΠ΅ ΡΠ΅ ΠΎΠ΄ ΡΠ°Π΄Π° ΠΊΠΎΡΠΈΡΡΠ΅.
ΠΠ°ΠΆΠ°Π»ΠΎΡΡ, ΠΈΠ·Π²ΠΎΡΠ½ΠΈ ΠΊΠΎΠ΄ Π·Π° ΡΡΠ΅ΡΠ΅ ΠΈΠ·Π΄Π°ΡΠ΅ Π£Π½ΠΈΠΊ ΠΊΠ΅ΡΠ½Π΅Π»Π° ΡΠ΅ ΠΈΠ·Π³ΡΠ±ΡΠ΅Π½. Π ΠΈΠ°ΠΊΠΎ ΠΈΠΌΠ°ΠΌΠΎ ΠΈΠ·Π²ΠΎΡΠ½ΠΈ ΠΊΠΎΠ΄ ΠΊΠ΅ΡΠ½Π΅Π»Π° Π½Π°ΠΏΠΈΡΠ°Π½ Ρ Π¦
ΠΠΌΠ°ΠΌΠΎ ΡΠ΅ΠΊΡΡΡΠ°Π»Π½Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ Π·Π° pipe(2)
ΠΈΠ· ΠΎΠ±Π° ΠΈΠ·Π΄Π°ΡΠ°, ΡΠ°ΠΊΠΎ Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΡΠ΅ΡΠΈ ΠΏΡΠ΅ΡΡΠ°ΠΆΠΈΠ²Π°ΡΠ΅ΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ pipe(2)
ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ Ρ Π°ΡΠ΅ΠΌΠ±Π»Π΅ΡΡΠΊΠΎΠΌ ΡΠ΅Π·ΠΈΠΊΡ ΠΈ Π²ΡΠ°ΡΠ° ΡΠ°ΠΌΠΎ ΡΠ΅Π΄Π°Π½ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅, Π°Π»ΠΈ Π²Π΅Ρ ΠΏΡΡΠΆΠ° ΠΎΡΠ΅ΠΊΠΈΠ²Π°Π½Ρ ΠΎΡΠ½ΠΎΠ²Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ:
Π‘ΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ·ΠΈΠ² ΡΠ΅Π² ΡΡΠ²Π°ΡΠ° ΡΠ»Π°Π·Π½ΠΎ/ΠΈΠ·Π»Π°Π·Π½ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ ΠΊΠΎΡΠΈ ΡΠ΅ Π½Π°Π·ΠΈΠ²Π° ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄. ΠΡΠ°ΡΠ΅Π½ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΠΌΠΎΠΆΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠ΅ ΡΠΈΡΠ°ΡΠ° ΠΈ ΠΏΠΈΡΠ°ΡΠ°. ΠΠ°Π΄Π° ΡΠ΅ Π½Π΅ΡΡΠΎ ΡΠΏΠΈΡΠ΅ Ρ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄, Π±Π°ΡΠ΅ΡΡΡΠ΅ ΡΠ΅ Π΄ΠΎ 504 Π±Π°ΡΡΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°, Π½Π°ΠΊΠΎΠ½ ΡΠ΅Π³Π° ΡΠ΅ ΠΏΡΠΎΡΠ΅Ρ ΠΏΠΈΡΠ°ΡΠ° ΡΡΡΠΏΠ΅Π½Π΄ΡΡΠ΅. ΠΡΠΈΠ»ΠΈΠΊΠΎΠΌ ΡΠΈΡΠ°ΡΠ° ΠΈΠ· ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π°, Π±Π°ΡΠ΅ΡΠΎΠ²Π°Π½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΈ ΡΠ΅ ΠΎΠ΄ΡΠ·ΠΈΠΌΠ°ΡΡ.
ΠΠΎ ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π³ΠΎΠ΄ΠΈΠ½Π΅ ΡΠ΅Π·Π³ΡΠΎ ΡΠ΅ ΠΏΡΠ΅ΠΏΠΈΡΠ°Π½ΠΎ Ρ Π¦, ΠΈ pipe(fildes)
"
Π‘ΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ·ΠΈΠ² ΡΠ΅Π² ΡΡΠ²Π°ΡΠ° ΡΠ»Π°Π·Π½ΠΎ/ΠΈΠ·Π»Π°Π·Π½ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ ΠΊΠΎΡΠΈ ΡΠ΅ Π½Π°Π·ΠΈΠ²Π° ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄. ΠΠ΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ Π²ΡΠ°ΡΠ΅Π½ΠΈΡ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΌΠΎΠ³Ρ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠ°ΠΌΠ° ΡΠΈΡΠ°ΡΠ° ΠΈ ΠΏΠΈΡΠ°ΡΠ°. ΠΠ°Π΄Π° ΡΠ΅ Π½Π΅ΡΡΠΎ ΡΠΏΠΈΡΠ΅ Ρ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄, ΠΊΠΎΡΠΈΡΡΠΈ ΡΠ΅ ΡΡΡΠΊΠ° Π²ΡΠ°ΡΠ΅Π½Π° Ρ Ρ1 (ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ ΡΠΈΠ»Π΄Π΅Ρ[1]), Π±Π°ΡΠ΅ΡΠΎΠ²Π°Π½Π° Π½Π° 4096 Π±Π°ΡΡΠΎΠ²Π° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°, Π½Π°ΠΊΠΎΠ½ ΡΠ΅Π³Π° ΡΠ΅ ΠΏΡΠΎΡΠ΅Ρ ΠΏΠΈΡΠ°ΡΠ° ΡΡΡΠΏΠ΅Π½Π΄ΡΡΠ΅. ΠΡΠΈΠ»ΠΈΠΊΠΎΠΌ ΡΠΈΡΠ°ΡΠ° ΠΈΠ· ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π°, ΡΡΡΠΈΡΠ° Π²ΡΠ°ΡΠ΅Π½Π° Π½Π° Ρ0 (ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ ΡΠΈΠ»Π΄Π΅Ρ[0]) ΠΏΡΠ΅ΡΠ·ΠΈΠΌΠ° ΠΏΠΎΠ΄Π°ΡΠΊΠ΅.
ΠΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΡΠ° ΡΠ΅ Π΄Π° ΠΊΠ°Π΄Π° ΡΠ΅ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½, Π΄Π²Π° (ΠΈΠ»ΠΈ Π²ΠΈΡΠ΅) ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΎΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΠ° (ΠΊΡΠ΅ΠΈΡΠ°Π½ΠΈ Π½Π°ΠΊΠ½Π°Π΄Π½ΠΈΠΌ ΠΏΠΎΠ·ΠΈΠ²ΠΈΠΌΠ° ΠΊΠ° Π²ΠΈΡΡΡΠΊΠ°) ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΠΈ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ ΠΈΠ· ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° ΠΏΠΎΠΌΠΎΡΡ ΠΏΠΎΠ·ΠΈΠ²Π° ΡΠΈΡΠ°ΡΠΈ ΠΈ write (ΠΏΠΈΡΠ°ΡΠΈ).
Π‘Ρ Π΅Π»Π» ΠΈΠΌΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΡ Π·Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ Π»ΠΈΠ½Π΅Π°ΡΠ½ΠΎΠ³ Π½ΠΈΠ·Π° ΠΏΡΠΎΡΠ΅ΡΠ° ΠΏΠΎΠ²Π΅Π·Π°Π½ΠΈΡ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ΠΎΠΌ.
ΠΠΎΠ·ΠΈΠ²ΠΈ Π·Π° ΡΠΈΡΠ°ΡΠ΅ ΠΈΠ· ΠΏΡΠ°Π·Π½ΠΎΠ³ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° (ΠΊΠΎΡΠΈ Π½Π΅ ΡΠ°Π΄ΡΠΆΠΈ Π±Π°ΡΠ΅ΡΠΎΠ²Π°Π½Π΅ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅) ΠΊΠΎΡΠΈ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ ΡΠ΅Π΄Π°Π½ ΠΊΡΠ°Ρ (ΡΠ²ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ Π·Π° ΠΏΠΈΡΠ°ΡΠ΅ ΡΡ Π·Π°ΡΠ²ΠΎΡΠ΅Π½ΠΈ) Π²ΡΠ°ΡΠ°ΡΡ βΠΊΡΠ°Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅β. ΠΠΎΠ·ΠΈΠ²ΠΈ Π½Π° ΠΏΠΈΡΠ°ΡΠ΅ Ρ ΡΠ»ΠΈΡΠ½ΠΎΡ ΡΠΈΡΡΠ°ΡΠΈΡΠΈ ΡΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΡ.
ΠΠ°ΡΡΠ°Π½ΠΈΡΠ΅
Π¨Π΅ΡΡΠΎ ΠΈΠ·Π΄Π°ΡΠ΅ Π£Π½ΠΈΠΊΠ° (1975)
ΠΠΎΡΠ½ΠΈΠΌΠΎ Π΄Π° ΡΠΈΡΠ°ΠΌΠΎ Π£Π½ΠΈΠΊ ΠΈΠ·Π²ΠΎΡΠ½ΠΈ ΠΊΠΎΠ΄
ΠΡΠ³ΠΈ Π½ΠΈΠ· Π³ΠΎΠ΄ΠΈΠ½Π° ΠΊΡΠΈΠ³Π° ΠΠ½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠΈ ΡΠ΅ Π±ΠΈΠΎ ΡΠ΅Π΄ΠΈΠ½ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ ΠΎ Π£Π½ΠΈΠΊ ΠΊΠ΅ΡΠ½Π΅Π»Ρ Π΄ΠΎΡΡΡΠΏΠ°Π½ Π²Π°Π½ ΠΠ΅Π»Π» ΠΠ°Π±Ρ-Π°. ΠΠ°ΠΊΠΎ ΡΠ΅ Π»ΠΈΡΠ΅Π½ΡΠ° ΡΠ΅ΡΡΠΎΠ³ ΠΈΠ·Π΄Π°ΡΠ° ΠΎΠΌΠΎΠ³ΡΡΠ°Π²Π°Π»Π° Π½Π°ΡΡΠ°Π²Π½ΠΈΡΠΈΠΌΠ° Π΄Π° ΠΊΠΎΡΠΈΡΡΠ΅ ΡΠ΅Π½ ΠΈΠ·Π²ΠΎΡΠ½ΠΈ ΠΊΠΎΠ΄, Π»ΠΈΡΠ΅Π½ΡΠ° ΡΠ΅Π΄ΠΌΠΎΠ³ ΠΈΠ·Π΄Π°ΡΠ° ΡΠ΅ ΠΈΡΠΊΡΡΡΠΈΠ»Π° ΠΎΠ²Ρ ΠΌΠΎΠ³ΡΡΠ½ΠΎΡΡ, ΠΏΠ° ΡΠ΅ ΠΊΡΠΈΠ³Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½Π° Ρ ΠΎΠ±Π»ΠΈΠΊΡ ΠΈΠ»Π΅Π³Π°Π»Π½ΠΈΡ ΠΊΡΡΠ°Π½ΠΈΡ ΠΊΠΎΠΏΠΈΡΠ°.
ΠΠ°Π½Π°Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΊΡΠΏΠΈΡΠΈ ΡΠ΅ΠΏΡΠΈΠ½Ρ ΠΊΡΠΈΠ³Π΅ Π½Π° ΡΠΈΡΠΈΠΌ ΠΊΠΎΡΠΈΡΠ°ΠΌΠ° ΡΡ ΡΡΠ΅Π½ΠΈΡΠΈ Π·Π° ΡΠΎΡΠΎΠΊΠΎΠΏΠΈΡ ΠΌΠ°ΡΠΈΠ½ΠΎΠΌ. Π Π·Π°Ρ
Π²Π°ΡΡΡΡΡΠΈ ΠΠΎΡΠ΅Π½Ρ Π’ΠΎΠΎΠΌΠΈΡΡ (ΠΊΠΎΡΠΈ ΡΠ΅ Π·Π°ΠΏΠΎΡΠ΅ΠΎ ΠΏΡΠΎΡΠ΅ΠΊΠ°Ρ Π’Π£Π₯Π‘) ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠ΅ΡΠ·Π΅ΡΠΈ
ΠΡΠ΅ Π²ΠΈΡΠ΅ ΠΎΠ΄ 15 Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΎΡΠΊΡΡΠ°ΠΎ ΡΠ°ΠΌ ΠΊΠΎΠΏΠΈΡΡ Π΄Π°ΡΠΎΠ³ ΠΈΠ·Π²ΠΎΡΠ½ΠΎΠ³ ΠΊΠΎΠ΄Π° ΠΠ½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠΈ, ΡΠ΅Ρ ΠΌΠΈ ΡΠ΅ Π½ΠΈΡΠ΅ Π΄ΠΎΠΏΠ°ΠΎ ΠΊΠ²Π°Π»ΠΈΡΠ΅Ρ ΠΌΠΎΠ³ ΠΏΡΠΈΠΌΠ΅ΡΠΊΠ° ΠΈΠ· Π½Π΅ΠΏΠΎΠ·Π½Π°ΡΠΎΠ³ Π±ΡΠΎΡΠ° Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΊΠ°. Π’Π£Π₯Π‘ ΡΠΎΡ Π½ΠΈΡΠ΅ ΠΏΠΎΡΡΠΎΡΠ°ΠΎ ΠΈ Π½ΠΈΡΠ°ΠΌ ΠΈΠΌΠ°ΠΎ ΠΏΡΠΈΡΡΡΠΏ ΡΡΠ°ΡΠΈΠΌ ΠΈΠ·Π²ΠΎΡΠΈΠΌΠ°. ΠΠ»ΠΈ 1988. ΠΏΡΠΎΠ½Π°ΡΠ°ΠΎ ΡΠ°ΠΌ ΡΡΠ°ΡΡ ΡΡΠ°ΠΊΡ ΡΠ° 9 ΡΡΠ°ΠΊΠ° ΠΊΠΎΡΠ° ΡΠ΅ ΡΠ°Π΄ΡΠΆΠ°Π»Π° ΡΠ΅Π·Π΅ΡΠ²Π½Ρ ΠΊΠΎΠΏΠΈΡΡ ΡΠ° ΠΠΠ11 ΡΠ°ΡΡΠ½Π°ΡΠ°. ΠΠΈΠ»ΠΎ ΡΠ΅ ΡΠ΅ΡΠΊΠΎ ΡΠ΅ΡΠΈ Π΄Π° Π»ΠΈ ΡΠ°Π΄ΠΈ, Π°Π»ΠΈ ΠΏΠΎΡΡΠΎΡΠ°Π»ΠΎ ΡΠ΅ Π½Π΅ΡΠ°ΠΊΠ½ΡΡΠΎ /ΡΡΡ/ΡΡΡ/ ΡΡΠ°Π±Π»ΠΎ Ρ ΠΊΠΎΡΠ΅ΠΌ ΡΠ΅ Π²Π΅ΡΠΈΠ½Π° ΡΠ°ΡΠ»ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ΅Π½Π° ΡΠ° Π³ΠΎΠ΄ΠΈΠ½ΠΎΠΌ 1979, ΠΊΠΎΡΠ° ΡΠ΅ ΡΠ°ΠΊ ΠΈ ΡΠ°Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π°Π»Π° Π΄ΡΠ΅Π²Π½ΠΎ. ΠΠΈΠ»ΠΎ ΡΠ΅ ΡΠΎ ΡΠ΅Π΄ΠΌΠΎ ΠΈΠ·Π΄Π°ΡΠ΅ ΠΈΠ»ΠΈ ΡΠ΅Π³ΠΎΠ² Π΄Π΅ΡΠΈΠ²Π°Ρ ΠΠΠ, ΠΊΠ°ΠΊΠΎ ΡΠ°ΠΌ Π²Π΅ΡΠΎΠ²Π°ΠΎ.
Π£Π·Π΅ΠΎ ΡΠ°ΠΌ Π½Π°Π»Π°Π· ΠΊΠ°ΠΎ ΠΎΡΠ½ΠΎΠ²Ρ ΠΈ ΡΡΡΠ½ΠΎ ΡΡΠ΅Π΄ΠΈΠΎ ΠΈΠ·Π²ΠΎΡΠ΅ Π΄ΠΎ ΡΠ΅ΡΡΠΎΠ³ ΠΈΠ·Π΄Π°ΡΠ°. ΠΠ΅ΠΊΠΈ ΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΠ²Π° ΡΡ ΠΎΡΡΠ°Π»ΠΈ ΠΈΡΡΠΈ, Π°Π»ΠΈ ΡΡ Π½Π΅ΠΊΠΈ ΠΌΠΎΡΠ°Π»ΠΈ Π±ΠΈΡΠΈ ΠΌΠ°Π»ΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈ, ΠΌΠ΅ΡΠ°ΡΡΡΠΈ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈ ΡΠΎΠΊΠ΅Π½ += Ρ Π·Π°ΡΡΠ°ΡΠ΅Π»ΠΈ =+. ΠΠ΅ΠΊΠ΅ ΡΡΠ²Π°ΡΠΈ ΡΡ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΎΠ±ΡΠΈΡΠ°Π½Π΅, Π° Π½Π΅ΠΊΠ΅ ΡΡ ΠΌΠΎΡΠ°Π»Π΅ Π±ΠΈΡΠΈ ΠΏΠΎΡΠΏΡΠ½ΠΎ ΠΏΡΠ΅ΠΏΠΈΡΠ°Π½Π΅, Π°Π»ΠΈ Π½Π΅ ΠΏΡΠ΅Π²ΠΈΡΠ΅.
Π Π΄Π°Π½Π°Ρ ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° ΡΠΈΡΠ°ΠΌΠΎ ΠΎΠ½Π»Π°ΡΠ½ Π½Π° Π’Π£Π₯Π‘ ΠΈΠ·Π²ΠΎΡΠ½ΠΈ ΠΊΠΎΠ΄ ΡΠ΅ΡΡΠΎΠ³ ΠΈΠ·Π΄Π°ΡΠ° ΠΎΠ΄
ΠΠ½Π°ΡΠ΅, Π½Π° ΠΏΡΠ²ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄, Π³Π»Π°Π²Π½Π° ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π¦-ΠΊΠΎΠ΄Π° ΠΏΡΠ΅ ΠΏΠ΅ΡΠΈΠΎΠ΄Π° ΠΠ΅ΡΠ½ΠΈΠ³Π°Π½Π° ΠΈ Π ΠΈΡΠΈΡΠ° ΡΠ΅ ΡΠ΅Π³ΠΎΠ²Π° ΠΊΡΠ°ΡΠΊΠΎΡΠ°. ΠΠΈΡΠ΅ ΡΠ΅ΡΡΠΎ Π΄Π° ΠΌΠΎΠ³Ρ Π΄Π° ΡΠ±Π°ΡΠΈΠΌ Π΄Π΅Π»ΠΎΠ²Π΅ ΠΊΠΎΠ΄Π° Π±Π΅Π· ΠΎΠΏΡΠ΅ΠΆΠ½ΠΎΠ³ ΡΡΠ΅ΡΠΈΠ²Π°ΡΠ° ΠΊΠ°ΠΊΠΎ Π±ΠΈ ΡΠ΅ ΡΠΊΠ»ΠΎΠΏΠΈΠΎ Ρ ΡΠ΅Π»Π°ΡΠΈΠ²Π½ΠΎ ΡΡΠΊΠΎ ΠΏΠΎΠ΄ΡΡΡΡΠ΅ ΠΏΡΠΈΠΊΠ°Π·Π° Π½Π° ΠΌΠΎΡΠΎΡ Π²Π΅Π± Π»ΠΎΠΊΠ°ΡΠΈΡΠΈ.
Π Π°Π½ΠΎ
/*
* 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
ΠΠ΅Π»ΠΈΡΠΈΠ½Π° Π±Π°ΡΠ΅ΡΠ° ΡΠ΅ Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»Π° ΠΎΠ΄ ΡΠ΅ΡΠ²ΡΡΠΎΠ³ ΠΈΠ·Π΄Π°ΡΠ°. ΠΠ»ΠΈ ΠΎΠ²Π΄Π΅ Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π±Π΅Π· ΠΈΠΊΠ°ΠΊΠ²Π΅ ΡΠ°Π²Π½Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅, Π΄Π° ΡΡ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ Π½Π΅ΠΊΠ°Π΄Π° ΠΊΠΎΡΠΈΡΡΠΈΠ»ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ΅ ΠΊΠ°ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ ΡΠ΅Π·Π΅ΡΠ²Π½ΠΈΡ ΠΊΠΎΠΏΠΈΡΠ°!
Π¨ΡΠΎ ΡΠ΅ ΡΠΈΡΠ΅ ΠΠΠ Π Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, ΠΎΠ½ΠΈ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°ΡΡ
ΠΠ²ΠΎ ΠΏΡΠ°Π²ΠΎΠ³ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΎΠ³ ΠΏΠΎΠ·ΠΈΠ²Π° 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
).
ΠΠ°ΡΠΈΠΌ ΠΏΡΠΎΠ²Π΅ΡΠ°Π²Π°ΠΌΠΎ ΠΈΠ½ΠΎΠ΄Π΅ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ½ΠΈ Π±ΡΠΎΡΠ°Ρ. Π‘Π²Π΅ Π΄ΠΎΠΊ ΠΎΠ±Π° ΠΊΡΠ°ΡΠ° ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° ΠΎΡΡΠ°ΡΡ ΠΎΡΠ²ΠΎΡΠ΅Π½Π°, Π±ΡΠΎΡΠ°Ρ ΡΡΠ΅Π±Π° Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅Π΄Π½Π°ΠΊ 2. ΠΡΠΆΠΈΠΌΠΎ ΡΠ΅Π΄Π½Ρ ΠΊΠ°ΡΠΈΠΊΡ (ΠΎΠ΄ rp->f_inode
), ΠΏΠ° Π°ΠΊΠΎ ΡΠ΅ Π±ΡΠΎΡΠ°Ρ ΠΌΠ°ΡΠΈ ΠΎΠ΄ 2, ΡΠΎ ΠΌΠΎΡΠ° Π΄Π° Π·Π½Π°ΡΠΈ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ΅Ρ ΡΠΈΡΠ°ΡΠ° Π·Π°ΡΠ²ΠΎΡΠΈΠΎ ΡΠ²ΠΎΡ ΠΊΡΠ°Ρ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π°. ΠΡΡΠ³ΠΈΠΌ ΡΠ΅ΡΠΈΠΌΠ°, ΠΏΠΎΠΊΡΡΠ°Π²Π°ΠΌΠΎ Π΄Π° ΠΏΠΈΡΠ΅ΠΌΠΎ Ρ Π·Π°ΡΠ²ΠΎΡΠ΅Π½ΠΈ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄, Π° ΠΎΠ²ΠΎ ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ°. ΠΡΠ²ΠΈ ΠΏΡΡ ΠΊΠΎΠ΄ Π³ΡΠ΅ΡΠΊΠ΅ EPIPE
ΠΈ ΡΠΈΠ³Π½Π°Π» SIGPIPE
ΠΏΠΎΡΠ°Π²ΠΈΠΎ ΡΠ΅ Ρ ΡΠ΅ΡΡΠΎΠΌ ΠΈΠ·Π΄Π°ΡΡ Π£Π½ΠΈΠΊ-Π°.
ΠΠ»ΠΈ ΡΠ°ΠΊ ΠΈ Π°ΠΊΠΎ ΡΠ΅ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½, ΠΌΠΎΠΆΠ΅ Π±ΠΈΡΠΈ ΠΏΡΠ½. Π£ ΠΎΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ ΠΎΡΠΏΡΡΡΠ°ΠΌΠΎ Π±ΡΠ°Π²Ρ ΠΈ ΠΈΠ΄Π΅ΠΌΠΎ Π½Π° ΡΠΏΠ°Π²Π°ΡΠ΅ Ρ Π½Π°Π΄ΠΈ Π΄Π° ΡΠ΅ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΡΠ΅Ρ ΠΏΡΠΎΡΠΈΡΠ°ΡΠΈ ΠΈΠ· ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° ΠΈ ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΠΈΡΠΈ Π΄ΠΎΠ²ΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΡΠ° Ρ ΡΠ΅ΠΌΡ. ΠΠ°ΠΊΠΎΠ½ Π±ΡΡΠ΅ΡΠ°, Π²ΡΠ°ΡΠ°ΠΌΠΎ ΡΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠ°ΠΊ, ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΡΠΏΡΡΡΠ°ΠΌΠΎ Π±ΡΠ°Π²Ρ ΠΈ Π·Π°ΠΏΠΎΡΠΈΡΠ΅ΠΌΠΎ Π½ΠΎΠ²ΠΈ ΡΠΈΠΊΠ»ΡΡ ΡΠ½ΠΈΠΌΠ°ΡΠ°.
ΠΠΊΠΎ Ρ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Ρ ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΡΠ½ΠΎ ΡΠ»ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ ΠΏΡΠΎΡΡΠΎΡΠ°, ΠΎΠ½Π΄Π° Ρ ΡΠ΅Π³Π° ΡΠΏΠΈΡΡΡΠ΅ΠΌΠΎ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ i_size1
ΠΈΠ½ΠΎΠ΄Π΅ (Π°ΠΊΠΎ ΡΠ΅ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ ΠΏΡΠ°Π·Π°Π½, ΠΌΠΎΠΆΠ΅ Π±ΠΈΡΠΈ ΡΠ΅Π΄Π½Π°ΠΊ 0) ΠΎΠ·Π½Π°ΡΠ°Π²Π° ΠΊΡΠ°Ρ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΊΠΎΡΠ΅ Π²Π΅Ρ ΡΠ°Π΄ΡΠΆΠΈ. ΠΠΊΠΎ ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΡΠ° Π·Π° ΡΠ½ΠΈΠΌΠ°ΡΠ΅, ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° Π½Π°ΠΏΡΠ½ΠΈΠΌΠΎ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ ΠΈΠ· i_size1
Π΄ΠΎ PIPESIZ
. ΠΠ°ΡΠΈΠΌ ΠΎΡΠΏΡΡΡΠ°ΠΌΠΎ Π·Π°ΠΊΡΡΡΠ°Π²Π°ΡΠ΅ ΠΈ ΠΏΠΎΠΊΡΡΠ°Π²Π°ΠΌΠΎ Π΄Π° ΠΏΡΠΎΠ±ΡΠ΄ΠΈΠΌΠΎ Π±ΠΈΠ»ΠΎ ΠΊΠΎΡΠΈ ΠΏΡΠΎΡΠ΅Ρ ΠΊΠΎΡΠΈ ΡΠ΅ΠΊΠ° Π½Π° ΡΠΈΡΠ°ΡΠ΅ ΡΠ° ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π°. ΠΡΠ°ΡΠ°ΠΌΠΎ ΡΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠ°ΠΊ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠΎ Π΄Π° Π»ΠΈ ΡΠΌΠΎ Ρ ΡΡΠ°ΡΡ Π΄Π° Π·Π°ΠΏΠΈΡΠ΅ΠΌΠΎ ΠΎΠ½ΠΎΠ»ΠΈΠΊΠΎ Π±Π°ΡΡΠΎΠ²Π° ΠΊΠΎΠ»ΠΈΠΊΠΎ Π½Π°ΠΌ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ. ΠΠΊΠΎ Π½Π΅ ΡΡΠΏΠ΅, ΠΏΠΎΡΠΈΡΠ΅ΠΌΠΎ Π½ΠΎΠ²ΠΈ ΡΠΈΠΊΠ»ΡΡ ΡΠ½ΠΈΠΌΠ°ΡΠ°.
ΠΠ±ΠΈΡΠ½ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°Ρ i_mode
ΠΈΠ½ΠΎΠ΄Π΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΡΡΠ²Π°ΡΠ΅ Π΄ΠΎΠ·Π²ΠΎΠ»Π° r
, w
ΠΈ x
. ΠΠ»ΠΈ Ρ ΡΠ»ΡΡΠ°ΡΡ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π°, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠΎ Π΄Π° Π½Π΅ΠΊΠΈ ΠΏΡΠΎΡΠ΅Ρ ΡΠ΅ΠΊΠ° Π½Π° ΠΏΠΈΡΠ°ΡΠ΅ ΠΈΠ»ΠΈ ΡΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠΌΠΎΡΡ Π±ΠΈΡΠΎΠ²Π° IREAD
ΠΈ IWRITE
ΡΠ΅Π΄ΠΎΠΌ. ΠΡΠΎΡΠ΅Ρ ΠΏΠΎΡΡΠ°Π²ΡΠ° Π·Π°ΡΡΠ°Π²Ρ ΠΈ ΠΏΠΎΠ·ΠΈΠ²Π° sleep()
, Π° ΠΎΡΠ΅ΠΊΡΡΠ΅ ΡΠ΅ Π΄Π° ΡΠ΅ Π½Π΅ΠΊΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΡΠ΅Ρ Ρ Π±ΡΠ΄ΡΡΠ½ΠΎΡΡΠΈ ΠΈΠ·Π°Π·Π²Π°ΡΠΈ wakeup()
.
ΠΡΠ°Π²Π° ΠΌΠ°Π³ΠΈΡΠ° ΡΠ΅ Π΄Π΅ΡΠ°Π²Π° Ρ sleep()
ΠΈ wakeup()
. ΠΠ½ΠΈ ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΡΡ Ρ
/*
* Give up the processor till a wakeup occurs
* on chan, at which time the process
* enters the scheduling queue at priority pri.
* The most important effect of pri is that when
* pri<0 a signal cannot disturb the sleep;
* if pri>=0 signals will be processed.
* Callers of this routine must be prepared for
* premature return, and check that the reason for
* sleeping has gone away.
*/
sleep(chan, pri) /* β¦ */
/*
* Wake up all processes sleeping on chan.
*/
wakeup(chan) /* β¦ */
ΠΡΠΎΡΠ΅Ρ ΠΊΠΎΡΠΈ ΡΠ·ΡΠΎΠΊΡΡΠ΅ sleep()
Π·Π° ΠΎΠ΄ΡΠ΅ΡΠ΅Π½ΠΈ ΠΊΠ°Π½Π°Π», ΠΌΠΎΠΆΠ΅ ΡΠ΅ ΠΊΠ°ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠ±ΡΠ΄ΠΈΡΠΈ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΠΎΠΌ, ΡΡΠΎ ΡΠ΅ ΡΠ·ΡΠΎΠΊΠΎΠ²Π°ΡΠΈ wakeup()
Π·Π° ΠΈΡΡΠΈ ΠΊΠ°Π½Π°Π». writep()
ΠΈ readp()
ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠ°ΡΡ ΡΠ²ΠΎΡΠ΅ Π°ΠΊΡΠΈΡΠ΅ ΠΏΡΡΠ΅ΠΌ ΡΠ°ΠΊΠ²ΠΈΡ
ΡΠΏΠ°ΡΠ΅Π½ΠΈΡ
ΠΏΠΎΠ·ΠΈΠ²Π°. Π½Π°ΠΏΠΎΠΌΠ΅Π½ΡΡΠΈ Π΄Π° pipe.c
ΡΠ²Π΅ΠΊ Π΄Π°ΡΠ΅ ΠΏΡΠ΅Π΄Π½ΠΎΡΡ PPIPE
ΠΏΡΠΈΠ»ΠΈΠΊΠΎΠΌ ΠΏΠΎΠ·ΠΈΠ²Π°ΡΠ° sleep()
, Π·Π½Π°ΡΠΈ ΡΠΎ ΡΠ΅ ΡΠΎ sleep()
ΠΌΠΎΠΆΠ΅ Π±ΠΈΡΠΈ ΠΏΡΠ΅ΠΊΠΈΠ½ΡΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ.
Π‘Π°Π΄Π° ΠΈΠΌΠ°ΠΌΠΎ ΡΠ²Π΅ Π΄Π° ΡΠ°Π·ΡΠΌΠ΅ΠΌΠΎ ΡΡΠ½ΠΊΡΠΈΡΡ readp()
:
readp(fp)
int *fp;
{
register *rp, *ip;
rp = fp;
ip = rp->f_inode;
loop:
/* Very conservative locking. */
plock(ip);
/*
* If the head (read) has caught up with
* the tail (write), reset both to 0.
*/
if(rp->f_offset[1] == ip->i_size1) {
if(rp->f_offset[1] != 0) {
rp->f_offset[1] = 0;
ip->i_size1 = 0;
if(ip->i_mode&IWRITE) {
ip->i_mode =& ~IWRITE;
wakeup(ip+1);
}
}
/*
* If there are not both reader and
* writer active, return without
* satisfying read.
*/
prele(ip);
if(ip->i_count < 2)
return;
ip->i_mode =| IREAD;
sleep(ip+2, PPIPE);
goto loop;
}
/* Read and return */
u.u_offset[0] = 0;
u.u_offset[1] = rp->f_offset[1];
readi(ip);
rp->f_offset[1] = u.u_offset[1];
prele(ip);
}
ΠΠΎΠΆΠ΄Π° ΡΠ΅ Π²Π°ΠΌ Π±ΠΈΡΠΈ Π»Π°ΠΊΡΠ΅ Π΄Π° ΡΠΈΡΠ°ΡΠ΅ ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΡΡ ΠΎΠ΄ΠΎΠ·Π΄ΠΎ ΠΏΡΠ΅ΠΌΠ° Π³ΠΎΡΠ΅. ΠΡΠ°Π½Π° "ΡΠΈΡΠ°Ρ ΠΈ Π²ΡΠ°ΡΠ°Ρ" ΡΠ΅ ΠΎΠ±ΠΈΡΠ½ΠΎ ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠ°Π΄Π° ΠΏΠΎΡΡΠΎΡΠ΅ Π½Π΅ΠΊΠΈ ΠΏΠΎΠ΄Π°ΡΠΈ Ρ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Ρ. Π£ ΠΎΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠΎ f_offset
ΡΠΈΡΠ°ΡΠ΅, Π° Π·Π°ΡΠΈΠΌ Π°ΠΆΡΡΠΈΡΠ°ΡΡΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡ ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°ΡΡΡΠ΅Π³ ΠΎΡΡΠ΅ΡΠ°.
ΠΡΠΈΠ»ΠΈΠΊΠΎΠΌ Π½Π°ΡΠ΅Π΄Π½ΠΈΡ
ΡΠΈΡΠ°ΡΠ°, ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ ΡΠ΅ Π±ΠΈΡΠΈ ΠΏΡΠ°Π·Π°Π½ Π°ΠΊΠΎ ΡΠ΅ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡ ΠΏΠΎΠΌΠ°ΠΊ ΡΠΈΡΠ°ΡΠ° i_size1
Π½Π° ΠΈΠ½ΠΎΠ΄Π΅. Π Π΅ΡΠ΅ΡΡΡΠ΅ΠΌΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΡΡ Π½Π° 0 ΠΈ ΠΏΠΎΠΊΡΡΠ°Π²Π°ΠΌΠΎ Π΄Π° ΠΏΡΠΎΠ±ΡΠ΄ΠΈΠΌΠΎ ΡΠ²Π°ΠΊΠΈ ΠΏΡΠΎΡΠ΅Ρ ΠΊΠΎΡΠΈ ΠΆΠ΅Π»ΠΈ Π΄Π° ΡΠΏΠΈΡΠ΅ Ρ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄. ΠΠ½Π°ΠΌΠΎ Π΄Π° ΠΊΠ°Π΄Π° ΡΠ΅ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅Ρ ΠΏΡΠ½, writep()
Π·Π°ΡΠΏΠ°ΡΠ΅ Π΄Π°ΡΠ΅ ip+1
. Π ΡΠ°Π΄Π° ΠΊΠ°Π΄Π° ΡΠ΅ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄ ΠΏΡΠ°Π·Π°Π½, ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π³Π° ΠΏΡΠΎΠ±ΡΠ΄ΠΈΡΠΈ Π΄Π° Π½Π°ΡΡΠ°Π²ΠΈ ΡΠ° ΡΠΈΠΊΠ»ΡΡΠΎΠΌ ΠΏΠΈΡΠ°ΡΠ°.
ΠΠΊΠΎ Π½Π΅ΠΌΠ°ΡΠ΅ ΡΡΠ° Π΄Π° ΡΠΈΡΠ°ΡΠ΅, ΠΎΠ½Π΄Π° readp()
ΠΌΠΎΠΆΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΈΡΠΈ Π·Π°ΡΡΠ°Π²Ρ IREAD
ΠΈ Π·Π°ΡΠΏΠ°ΡΠΈ Π΄Π°ΡΠ΅ ip+2
. ΠΠ½Π°ΠΌΠΎ ΡΡΠ° ΡΠ΅ Π³Π° ΠΏΡΠΎΠ±ΡΠ΄ΠΈΡΠΈ writep()
, ΠΊΠ°Π΄Π° ΡΠΏΠΈΡΡΡΠ΅ Π½Π΅ΠΊΠ΅ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ Ρ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄.
ΠΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ Π½Π° u
βΠΠΎΠΆΠ΅ΠΌΠΎ ΠΈΡ
ΡΡΠ΅ΡΠΈΡΠ°ΡΠΈ ΠΊΠ°ΠΎ Π½ΠΎΡΠΌΠ°Π»Π½Π΅ Π/Π ΡΡΠ½ΠΊΡΠΈΡΠ΅ ΠΊΠΎΡΠ΅ ΡΠ·ΠΈΠΌΠ°ΡΡ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ, ΠΏΠΎΠ·ΠΈΡΠΈΡΡ, Π±Π°ΡΠ΅Ρ Ρ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠΈ ΠΈ Π±ΡΠΎΡΠ΅ Π±ΡΠΎΡ Π±Π°ΡΡΠΎΠ²Π° Π·Π° ΡΠΈΡΠ°ΡΠ΅ ΠΈΠ»ΠΈ ΠΏΠΈΡΠ°ΡΠ΅.
/*
* Read the file corresponding to
* the inode pointed at by the argument.
* The actual read arguments are found
* in the variables:
* u_base core address for destination
* u_offset byte offset in file
* u_count number of bytes to read
* u_segflg read to kernel/user
*/
readi(aip)
struct inode *aip;
/* β¦ */
/*
* Write the file corresponding to
* the inode pointed at by the argument.
* The actual write arguments are found
* in the variables:
* u_base core address for source
* u_offset byte offset in file
* u_count number of bytes to write
* u_segflg write to kernel/user
*/
writei(aip)
struct inode *aip;
/* β¦ */
Π¨ΡΠΎ ΡΠ΅ ΡΠΈΡΠ΅ βΠΊΠΎΠ½Π·Π΅ΡΠ²Π°ΡΠΈΠ²Π½ΠΎΠ³β Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠ°, ΠΎΠ½Π΄Π° readp()
ΠΈ writep()
Π±Π»ΠΎΠΊΠΈΡΠ°ΡΡ ΠΈΠ½ΠΎΠ΄Π΅ Π΄ΠΎΠΊ Π½Π΅ Π·Π°Π²ΡΡΠ΅ ΡΠ²ΠΎΡ ΠΏΠΎΡΠ°ΠΎ ΠΈΠ»ΠΈ Π½Π΅ Π΄ΠΎΠ±ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ (ΡΠΎ ΡΠ΅ΡΡ, ΠΏΠΎΠ·ΠΈΠ² wakeup
). plock()
ΠΈ prele()
ΡΠ°Π΄Π΅ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ: ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ Π΄ΡΡΠ³Π°ΡΠΈΡΠΈ ΡΠΊΡΠΏ ΠΏΠΎΠ·ΠΈΠ²Π° sleep
ΠΈ wakeup
Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΡΠ΅ Π½Π°ΠΌ Π΄Π° ΠΏΡΠΎΠ±ΡΠ΄ΠΈΠΌΠΎ Π±ΠΈΠ»ΠΎ ΠΊΠΎΡΠΈ ΠΏΡΠΎΡΠ΅Ρ ΠΊΠΎΡΠΈ ΡΡΠ΅Π±Π° Π·Π°ΠΊΡΡΡΠ°Π²Π°ΡΠ΅ ΠΊΠΎΡΠ΅ ΡΠΌΠΎ ΡΠΏΡΠ°Π²ΠΎ ΠΎΡΠΏΡΡΡΠΈΠ»ΠΈ:
/*
* Lock a pipe.
* If its already locked, set the WANT bit and sleep.
*/
plock(ip)
int *ip;
{
register *rp;
rp = ip;
while(rp->i_flag&ILOCK) {
rp->i_flag =| IWANT;
sleep(rp, PPIPE);
}
rp->i_flag =| ILOCK;
}
/*
* Unlock a pipe.
* If WANT bit is on, wakeup.
* This routine is also used to unlock inodes in general.
*/
prele(ip)
int *ip;
{
register *rp;
rp = ip;
rp->i_flag =& ~ILOCK;
if(rp->i_flag&IWANT) {
rp->i_flag =& ~IWANT;
wakeup(rp);
}
}
Π£ ΠΏΠΎΡΠ΅ΡΠΊΡ Π½ΠΈΡΠ°ΠΌ ΠΌΠΎΠ³Π°ΠΎ Π΄Π° ΡΡ
Π²Π°ΡΠΈΠΌ Π·Π°ΡΡΠΎ readp()
Π½Π΅ ΠΈΠ·Π°Π·ΠΈΠ²Π° prele(ip)
ΠΏΡΠ΅ ΠΏΠΎΠ·ΠΈΠ²Π° wakeup(ip+1)
. ΠΡΠ²Π° ΡΡΠ²Π°Ρ ΡΠ΅ writep()
ΡΠ·ΡΠΎΠΊΡΡΠ΅ Ρ ΡΠ²ΠΎΠΌ ΡΠΈΠΊΠ»ΡΡΡ, ΠΎΠ²ΠΎ plock(ip)
, ΡΡΠΎ Π΄ΠΎΠ²ΠΎΠ΄ΠΈ Π΄ΠΎ Π·Π°ΡΡΠΎΡΠ° Π°ΠΊΠΎ readp()
ΡΠΎΡ Π½ΠΈΡΠ°ΠΌ ΡΠΊΠ»ΠΎΠ½ΠΈΠΎ ΠΌΠΎΡ Π±Π»ΠΎΠΊ, ΡΠ°ΠΊΠΎ Π΄Π° Π½Π΅ΠΊΠ°ΠΊΠΎ ΠΊΠΎΠ΄ ΠΌΠΎΡΠ° Π΄Π° ΡΠ°Π΄ΠΈ ΠΈΡΠΏΡΠ°Π²Π½ΠΎ. ΠΠΊΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π°ΡΠ΅ wakeup()
, ΠΎΠ½Π΄Π° ΠΏΠΎΡΡΠ°ΡΠ΅ ΡΠ°ΡΠ½ΠΎ Π΄Π° ΡΠ°ΠΌΠΎ ΠΎΠ·Π½Π°ΡΠ°Π²Π° ΠΏΡΠΎΡΠ΅Ρ ΡΠΏΠ°Π²Π°ΡΠ° ΠΊΠ°ΠΎ ΡΠΏΡΠ΅ΠΌΠ°Π½ Π·Π° ΠΈΠ·Π²ΡΡΠ΅ΡΠ΅, ΡΠ°ΠΊΠΎ Π΄Π° Ρ Π±ΡΠ΄ΡΡΠ½ΠΎΡΡΠΈ sched()
Π·Π°ΠΈΡΡΠ° Π³Π° ΠΏΠΎΠΊΡΠ΅Π½ΡΠΎ. Π’Π°ΠΊΠΎ readp()
ΡΠ·ΡΠΎΠΊΠ° wakeup()
, ΡΠΊΠ»Π°ΡΠ° Π±ΡΠ°Π²Ρ, ΠΏΠΎΡΡΠ°Π²ΡΠ° IREAD
ΠΈ ΠΏΠΎΠ·ΠΈΠ²Π° sleep(ip+2)
- ΡΠ²Π΅ ΠΎΠ²ΠΎ ΠΏΡΠ΅ writep()
Π½Π°ΡΡΠ°Π²ΡΠ° ΡΠΈΠΊΠ»ΡΡ.
ΠΠ²ΠΈΠΌ ΡΠ΅ Π·Π°Π²ΡΡΠ΅Π½ ΠΎΠΏΠΈΡ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅ΡΠ° Ρ ΡΠ΅ΡΡΠΎΠΌ ΠΈΠ·Π΄Π°ΡΡ. ΠΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π°Π½ ΠΊΠΎΠ΄, Π΄Π°Π»Π΅ΠΊΠΎΡΠ΅ΠΆΠ½Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΈΡΠ΅.
ΠΡΠ²6, ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ΅Π·Π³ΡΠΎ ΡΠ»ΠΈΡΠ½ΠΎ Π£Π½ΠΈΠΊΡ
ΠΠ° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΊΠ΅ΡΠ½Π΅Π»Π°
ΠΠΎΠ΄ ΡΠ°Π΄ΡΠΆΠΈ ΡΠ°ΡΠ½Ρ ΠΈ ΠΏΡΠΎΠΌΠΈΡΡΠ΅Π½Ρ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ 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
ΡΠ΅ ΠΎΠΌΠΎΡΠ°Ρ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ Ρ
ΠΠΈΠ½ΡΠΊ ΠΠ‘ΠΠ£ΠΠΠ‘
ΠΠΎΠΆΠ΅ ΡΠ΅ ΠΏΡΠΎΠ½Π°ΡΠΈ ΠΈΠ·Π²ΠΎΡΠ½ΠΈ ΠΊΠΎΠ΄ ΠΠΈΠ½ΡΠΊ 0.01. ΠΠΈΡΠ΅ ΠΏΠΎΡΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΈΡΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄Π° Ρ ΡΠ΅Π³ΠΎΠ²ΠΎΠΌ fs
/pipe.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
Π½Π΅ ΠΈΠ·Π³Π»Π΅Π΄Π° ΡΠ°ΠΊΠΎ ΡΡΡΠ°Π½ΠΎ.
ΠΠΎΠ΄Π΅ΡΠ½ΠΈ ΠΠΈΠ½ΡΠΊ ΠΊΠ΅ΡΠ½Π΅Π»ΠΈ, Π€ΡΠ΅Π΅ΠΠ‘Π, ΠΠ΅ΡΠΠ‘Π, ΠΠΏΠ΅Π½ΠΠ‘Π
ΠΡΠ·ΠΎ ΡΠ°ΠΌ ΠΏΡΠΎΡΠ°ΠΎ ΠΊΡΠΎΠ· Π½Π΅ΠΊΠ΅ ΠΌΠΎΠ΄Π΅ΡΠ½Π΅ ΠΊΠ΅ΡΠ½Π΅Π»Π΅. ΠΠΈΠΊΠΎ ΠΎΠ΄ ΡΠΈΡ Π²ΠΈΡΠ΅ Π½Π΅ΠΌΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ Π΄ΠΈΡΠΊΠ° (Π½ΠΈΡΠ΅ ΠΈΠ·Π½Π΅Π½Π°ΡΡΡΡΡΠ΅). ΠΠΈΠ½ΡΠΊ ΠΈΠΌΠ° ΡΠ²ΠΎΡΡ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ. ΠΠ°ΠΊΠΎ ΡΡΠΈ ΠΌΠΎΠ΄Π΅ΡΠ½Π° ΠΠ‘Π ΡΠ΅Π·Π³ΡΠ° ΡΠ°Π΄ΡΠΆΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅ Π·Π°ΡΠ½ΠΎΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Ρ ΠΊΠΎΡΠΈ ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΠΎ ΠΠΎΠ½ ΠΠ°ΡΡΠΎΠ½, ΡΠΎΠΊΠΎΠΌ Π³ΠΎΠ΄ΠΈΠ½Π° ΡΡ ΠΏΠΎΡΡΠ°Π»ΠΈ ΠΏΡΠ΅Π²ΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈΡΠΈ ΡΠ΅Π΄Π°Π½ ΠΎΠ΄ Π΄ΡΡΠ³ΠΎΠ³.
Π§ΠΈΡΠ°ΡΠΈ fs
/pipe.c
(Π½Π° ΠΠΈΠ½ΡΠΊ-Ρ) ΠΈΠ»ΠΈ sys
/kern
/sys_pipe.c
(Π½Π° *ΠΠ‘Π), ΠΏΠΎΡΡΠ΅Π±Π½Π° ΡΠ΅ ΠΏΡΠ°Π²Π° ΠΏΠΎΡΠ²Π΅ΡΠ΅Π½ΠΎΡΡ. ΠΠ°Π½Π°ΡΡΠΈ ΠΊΠΎΠ΄ ΡΠ΅ ΠΎΠ΄Π½ΠΎΡΠΈ Π½Π° ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠ΅ ΠΈ ΠΏΠΎΠ΄ΡΡΠΊΡ Π·Π° ΡΡΠ½ΠΊΡΠΈΡΠ΅ ΠΊΠ°ΠΎ ΡΡΠΎ ΡΡ Π²Π΅ΠΊΡΠΎΡΡΠΊΠΈ ΠΈ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈ Π/Π. Π Π΄Π΅ΡΠ°ΡΠΈ ΡΠ°ΡΠΏΠΎΠ΄Π΅Π»Π΅ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ΅, Π·Π°ΠΊΡΡΡΠ°Π²Π°ΡΠ° ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ΅ ΠΊΠ΅ΡΠ½Π΅Π»Π° Π²Π΅ΠΎΠΌΠ° ΡΠ΅ ΡΠ°Π·Π»ΠΈΠΊΡΡΡ. ΠΠ²ΠΎ Π½ΠΈΡΠ΅ ΠΎΠ½ΠΎ ΡΡΠΎ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΠΊΠΎΠ»Π΅ΡΠΈΠΌΠ° Π·Π° ΡΠ²ΠΎΠ΄Π½ΠΈ ΠΊΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈΡ
ΡΠΈΡΡΠ΅ΠΌΠ°.
Π£ ΡΠ²Π°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ, Π±ΠΈΠΎ ΡΠ°ΠΌ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½ Π΄Π° ΠΈΡΠΊΠΎΠΏΠ°ΠΌ Π½Π΅ΠΊΠ΅ ΡΡΠ°ΡΠ΅ ΠΎΠ±ΡΠ°ΡΡΠ΅ (ΠΊΠ°ΠΎ ΡΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ SIGPIPE
ΠΈ ΠΏΠΎΠ²ΡΠ°ΡΠ°ΠΊ EPIPE
ΠΏΡΠΈ ΠΏΠΈΡΠ°ΡΡ Ρ Π·Π°ΡΠ²ΠΎΡΠ΅Π½ΠΈ ΡΠ΅Π²ΠΎΠ²ΠΎΠ΄) Ρ ΡΠ²ΠΈΠΌ ΠΎΠ²ΠΈΠΌ ΡΠ°Π·Π»ΠΈΡΠΈΡΠΈΠΌ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠΌ ΡΠ΅Π·Π³ΡΠΈΠΌΠ°. ΠΠ΅ΡΠΎΠ²Π°ΡΠ½ΠΎ Π½ΠΈΠΊΠ°Π΄Π° Π½Π΅ΡΡ Π²ΠΈΠ΄Π΅ΡΠΈ ΡΠ°ΡΡΠ½Π°Ρ ΠΠΠ-11 Ρ ΡΡΠ²Π°ΡΠ½ΠΎΠΌ ΠΆΠΈΠ²ΠΎΡΡ, Π°Π»ΠΈ ΡΠΎΡ ΡΠ²Π΅ΠΊ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΎΠ³Π° Π΄Π° ΡΠ΅ Π½Π°ΡΡΠΈ ΠΈΠ· ΠΊΠΎΠ΄Π° ΠΊΠΎΡΠΈ ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π³ΠΎΠ΄ΠΈΠ½Π°ΠΌΠ° ΠΏΡΠ΅ ΠΌΠΎΠ³ ΡΠΎΡΠ΅ΡΠ°.
Π§Π»Π°Π½Π°ΠΊ ΠΊΠΎΡΠΈ ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΠΎ ΠΠΈΠ²ΠΈ ΠΠ°ΠΏΠΎΠΎΡ 2011:
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ
Π°Π±Ρ.ΡΠΎΠΌ