Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠ² Π² ΡΠ΄ΡΠ΅ Unix. Π― Π±ΡΠ» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·ΠΎΡΠ°ΡΠΎΠ²Π°Π½, ΡΡΠΎ Π½Π΅Π΄Π°Π²Π½ΡΡ ΡΡΠ°ΡΡΡ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«
Π ΡΡΠΌ ΡΠ΅ΡΡ?
ΠΠΎΠ½Π²Π΅ΠΉΠ΅ΡΡ β Β«Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΠ°ΠΌΠΎΠ΅ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² UnixΒ» β ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠ°Ρ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π»Π΅ΠΆΠ°ΡΠ΅ΠΉ Π² ΠΎΡΠ½ΠΎΠ²Π΅ Unix ΡΠΈΠ»ΠΎΡΠΎΡΠΈΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Π° ΡΠ°ΠΊΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠ°Ρ Π½Π°Π΄ΠΏΠΈΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅:
$ echo hello | wc -c
6
ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ΄ΡΠΎΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° pipe
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΠΈΡΠ°Π½ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°Ρ
Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
ΠΠΎΠ½Π²Π΅ΠΉΠ΅ΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ ΠΊΠ°Π½Π°Π» ΠΌΠ΅ΠΆΠΏΡΠΎΡΠ΅ΡΡΠ½ΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ. Π£ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π΅ΡΡΡ Π²Ρ ΠΎΠ΄ (write end) ΠΈ Π²ΡΡ ΠΎΠ΄ (read end). ΠΠ°Π½Π½ΡΠ΅, Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π²ΠΎ Π²Ρ ΠΎΠ΄ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΡΠΈΡΠ°Π½Ρ Π½Π° Π²ΡΡ ΠΎΠ΄Π΅.
ΠΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π°
pipe(2)
, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π΄Π²Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°: ΠΎΠ΄ΠΈΠ½ ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° Π²Ρ ΠΎΠ΄ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, Π²ΡΠΎΡΠΎΠΉ Π½Π° Π²ΡΡ ΠΎΠ΄.
Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠΉ Π²ΡΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΈ ΠΏΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π· Π½Π΅Π³ΠΎ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² Π΄ΡΡΠ³ΠΎΠΉ:
$ strace -qf -e execve,pipe,dup2,read,write
sh -c 'echo hello | wc -c'
execve("/bin/sh", ["sh", "-c", "echo hello | wc -c"], β¦)
pipe([3, 4]) = 0
[pid 2604795] dup2(4, 1) = 1
[pid 2604795] write(1, "hellon", 6) = 6
[pid 2604796] dup2(3, 0) = 0
[pid 2604796] execve("/usr/bin/wc", ["wc", "-c"], β¦)
[pid 2604796] read(0, "hellon", 16384) = 6
[pid 2604796] write(1, "6n", 2) = 2
Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ pipe()
, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½Π½ΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ. ΠΠ΄ΠΈΠ½ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² ΠΎΠ΄ΠΈΠ½ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π° Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠ΅ ΠΆΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°. ΠΠ±ΠΎΠ»ΠΎΡΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ dup2 Β«ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²ΡΠ²Π°Π΅ΡΒ» Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ 3 ΠΈ 4, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π»ΠΈ stdin ΠΈ stdout.
ΠΠ΅Π· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠ² ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² ΡΠ°ΠΉΠ» ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΅Π³ΠΎ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ ΡΠΎΡ ΠΏΡΠΎΡΠΈΡΠ°Π» Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΠ°ΠΉΠ»Π°. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΌΡ ΡΡΠ°ΡΠΈΠ»ΠΈ Π±Ρ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΈ ΠΌΠ΅ΡΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΡ Ρ ΠΎΡΠΎΡΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΌ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²:
ΠΡΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΈΠ· ΠΏΡΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΡΠΎΠ³Π΄Π°
read(2)
Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΡΡΠ°Π½ΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ. ΠΡΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π² Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ, ΡΠΎΠ³Π΄Π°write(2)
Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΈΠ· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΡΠΈΡΠ°Π½ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠΈ.
ΠΠ°ΠΊ ΠΈ POSIX-ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, ΡΡΠΎ Π²Π°ΠΆΠ½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ: Π·Π°ΠΏΠΈΡΡ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ Π²ΠΏΠ»ΠΎΡΡ Π΄ΠΎ PIPE_BUF
Π±Π°ΠΉΡΠΎΠ² (ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ 512) Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΠΉ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΌΠΎΠ³Π»ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ (Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΡΠ°ΠΊΠΈΡ
Π³Π°ΡΠ°Π½ΡΠΈΠΉ) Π½Π΅ ΠΌΠΎΠ³ΡΡ.
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π² Π½Π΅Π³ΠΎ Π²ΡΠ΅ ΡΠ²ΠΎΠΈ Π²ΡΡ ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ. ΠΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΌΠΎΠ³ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΆΡΡΡΠΊΠΎΠ³ΠΎ ΡΠ°ΡΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ²Π°Π½ΠΈΡ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΡΠΈΠ³Π½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° (Π²ΡΠΎΠ΄Π΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°) ΡΠΎΠΎΠ±ΡΠ°Ρ Π΄ΡΡΠ³ Π΄ΡΡΠ³Ρ ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ»ΠΈ ΡΡΠ΅Π½ΠΈΡ. ΠΠΎΠ½Π²Π΅ΠΉΠ΅ΡΡ ΠΈΠ·Π±Π°Π²Π»ΡΡΡ Π½Π°Ρ ΠΎΡ Π²ΡΠ΅Ρ ΡΡΠΈΡ Ρ Π»ΠΎΠΏΠΎΡ.
Π§ΡΠΎ ΠΌΡ ΠΈΡΠ΅ΠΌ?
ΠΠ±ΡΡΡΠ½Ρ Π½Π° ΠΏΠ°Π»ΡΡΠ°Ρ , ΡΡΠΎΠ±Ρ Π²Π°ΠΌ Π±ΡΠ»ΠΎ Π»Π΅Π³ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ. ΠΠ°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ Π±ΡΡΠ΅Ρ ΠΈ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· Π±ΡΡΠ΅ΡΠ°. ΠΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ, ΡΡΠΎΠ±Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Ρ ΠΎΠ΄Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ. Π ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, ΡΡΠΎΠ±Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ Π²ΡΡΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ Π³ΠΎΡΠΎΠ²Ρ Π΄ΠΎΠΏΡΠΎΡΠΈΡΡ ΠΏΡΠΈ ΡΡΠΊΠΎΠΌ ΡΠ²Π΅ΡΠ΅ Π»Π°ΠΌΠΏ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΄ΡΠ°, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡ ΠΈΠ»ΠΈ ΠΎΠΏΡΠΎΠ²Π΅ΡΠ³Π½ΡΡΡ Π½Π°ΡΡ ΡΠΌΡΡΠ½ΡΡ ΠΌΡΡΠ»Π΅Π½Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ. ΠΠΎ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄ΡΡΠ΅ Π³ΠΎΡΠΎΠ²Ρ ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΡΡΡΠΌ.
ΠΠ΄Π΅ ΠΌΡ ΠΈΡΠ΅ΠΌ?
Π― Π½Π΅ Π·Π½Π°Ρ, Π³Π΄Π΅ Π»Π΅ΠΆΠΈΡ ΠΌΠΎΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ Β«
ΠΠ»ΡΠΆΠ΄Π°Π½ΠΈΠ΅ ΠΏΠΎ Π°ΡΡ ΠΈΠ²Π°ΠΌ TUHS ΡΡΠΎΠ΄Π½ΠΈ ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΡΠ·Π΅Ρ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π½Π° Π½Π°ΡΡ ΠΎΠ±ΡΡΡ ΠΈΡΡΠΎΡΠΈΡ, ΠΈ Ρ ΠΈΡΠΏΡΡΡΠ²Π°Ρ ΡΠ²Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΠ»Π΅ΡΠ½ΠΈΠΌ ΡΡΠΈΠ»ΠΈΡΠΌ ΠΏΠΎ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΡΠΈΡ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΎΠ² Π±ΠΈΡ Π·Π° Π±ΠΈΡΠΎΠΌ ΡΠΎ ΡΡΠ°ΡΡΡ ΠΊΠ°ΡΡΠ΅Ρ ΠΈ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠΎΠΊ. Π ΠΎΡΡΡΠΎ ΠΎΡΠΎΠ·Π½Π°Ρ ΡΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΅ΡΡ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ.
Π£Π΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠΈΠ² ΡΠ²ΠΎΡ Π»ΡΠ±ΠΎΠΏΡΡΡΡΠ²ΠΎ Π² ΡΠ°ΡΡΠΈ Π΄ΡΠ΅Π²Π½Π΅ΠΉ ΠΈΡΡΠΎΡΠΈΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠ², Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΄ΡΠ°.
ΠΡΡΠ°ΡΠΈ, pipe
ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ Π½ΠΎΠΌΠ΅Ρ 42 Π² ΡΠ°Π±Π»ΠΈΡΠ΅ sysent[]
. Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅?
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ΄ΡΠ° Unix (1970β1974)
Π― Π½Π΅ Π½Π°ΡΡΠ» Π½ΠΈΠΊΠ°ΠΊΠΈΡ
ΡΠ»Π΅Π΄ΠΎΠ² pipe(2)
Π½ΠΈ Π²
TUHS ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ, ΡΡΠΎ
Π’ΡΠ΅ΡΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΈΡ Unix Π±ΡΠ»Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ Ρ ΡΠ΄ΡΠΎΠΌ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π½Π° Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°ΠΌΠΈ. Π ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ 1973-Π³ΠΎ Π²Π΅Π»ΠΈΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ, ΡΠ΄ΡΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π»ΠΈ Π½Π° Π‘, ΠΈ ΡΠ°ΠΊ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ ΡΠ΅ΡΠ²ΡΡΡΠ°Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡ Unix.
ΠΠ΄ΠΈΠ½ ΠΈΠ· ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ Π½Π°ΡΡΠ» ΡΠΊΠ°Π½ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΠ°Π³ ΠΠ°ΠΊΠΠ»ΡΠΎΠΉ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΈΠ΄Π΅Ρ Β«ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ ΡΠ°Π΄ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ»Π°Π½Π³Π°Β».
Π ΠΊΠ½ΠΈΠ³Π΅ ΠΡΠ°ΠΉΠ°Π½Π° ΠΠ΅ΡΠ½ΠΈΠ³Π°Π½Π° Β«
ΠΠΎΠ³Π΄Π° ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Unix, ΠΌΠΎΡ ΡΠ²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΡΡΠΈΠ½Π°ΠΌΠΈ Π·Π°ΡΡΠ°Π²ΠΈΠ»ΠΎ ΠΌΠ΅Π½Ρ ΠΏΠΎΠΏΡΠΎΡΠΈΡΡ Π°Π²ΡΠΎΡΠ° ΠΠ‘, ΠΠ΅Π½Π° Π’ΠΎΠΌΠΏΡΠΎΠ½Π°, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ Π΄Π°Π½Π½ΡΠΌ, Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΌ Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΈΠ΄ΡΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ, Π½ΠΎ ΠΈ Π½Π° Π²ΡΡ ΠΎΠ΄ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ. ΠΠ΅Π½ ΡΠ΅ΡΠΈΠ», ΡΡΠΎ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡ, ΠΎΠ½ Ρ ΠΎΡΠ΅Π», ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠ³ΡΠ°Π»Π° Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠΎΠ»Ρ. ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ ΠΏΡΡΠΌΠ°Ρ Π·Π°ΠΏΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ ΠΈΠΌΠ΅Π΅Ρ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π·Π°ΠΏΠΈΡΡΡ Π² ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ»? Π ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° Ρ Π²Π½ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ Π±ΡΠΎΡΠΊΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Β«ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΒ» ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΠ΅Π½, Π½Π°ΠΊΠΎΠ½Π΅Ρ-ΡΠΎ, Π²ΠΎΡΠΊΠ»ΠΈΠΊΠ½ΡΠ»: Β«Π― ΡΠ΄Π΅Π»Π°Ρ ΡΡΠΎ!Β».
Π ΡΠ΄Π΅Π»Π°Π». ΠΠ΄Π½ΠΈΠΌ ΡΡΠ΄ΡΠ±ΠΎΠ½ΠΎΡΠ½ΡΠΌ Π²Π΅ΡΠ΅ΡΠΎΠΌ ΠΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» ΡΠ΄ΡΠΎ ΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ, ΠΈΡΠΏΡΠ°Π²ΠΈΠ» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π² ΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΏΡΠΈΠ½ΡΡΠΈΡ Π²Ρ ΠΎΠ΄Π½ΡΡ Π΄Π°Π½Π½ΡΡ (ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ ΠΈΠ· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°), Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠ΅Π½ΡΠ» ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π΄Π΅Π½Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΡ Π½Π°ΡΠ°Π»ΠΈ ΠΎΡΠ΅Π½Ρ ΡΠΈΡΠΎΠΊΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ . Π ΠΊΠΎΠ½ΡΡ Π½Π΅Π΄Π΅Π»ΠΈ ΡΠ΅ΠΊΡΠ΅ΡΠ°ΡΡΠΈ Ρ ΠΈΡ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ»ΠΈ Π½Π° ΠΏΡΠΈΠ½ΡΠ΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ ΠΈΠ· ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΎΠ². Π§ΡΡΡ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ ΠΠ΅Π½ Π·Π°ΠΌΠ΅Π½ΠΈΠ» ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ API ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π»Ρ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠ² Π½Π° Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΡΡΠ΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ ΡΠ΅Ρ ΠΏΠΎΡ ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΄ΡΠ° ΡΡΠ΅ΡΡΠ΅ΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ Unix ΡΡΠ΅ΡΡΠ½. Π Ρ
ΠΎΡΡ Ρ Π½Π°Ρ Π΅ΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π½Π° Π‘ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΄ΡΠ°
Π£ Π½Π°Ρ Π΅ΡΡΡ ΡΠ΅ΠΊΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎ pipe(2)
ΠΈΠ· ΠΎΠ±ΠΎΠΈΡ
ΡΠ΅Π»ΠΈΠ·ΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΠ°ΡΡ Ρ ΠΏΠΎΠΈΡΠΊΠ° Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ pipe(2)
Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π½ΠΎ ΡΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ:
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² pipe ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π²Π²ΠΎΠ΄Π° Π²ΡΠ²ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠΌ. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ. ΠΠΎΠ³Π΄Π° Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΡΡΠΎ-ΡΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ, ΡΠΎ Π±ΡΡΠ΅ΡΠΈΠ·ΡΠ΅ΡΡΡ Π΄ΠΎ 504 Π±Π°ΠΉΡΠΎΠ² Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ. ΠΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ ΠΈΠ· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π±ΡΡΠ΅ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π·Π°Π±ΠΈΡΠ°ΡΡΡΡ.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ Π³ΠΎΠ΄Ρ ΡΠ΄ΡΠΎ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° Π‘, Π° pipe(fildes)
Β»:
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² pipe ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π²Π²ΠΎΠ΄Π° Π²ΡΠ²ΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠΌ. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΡ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ. ΠΠΎΠ³Π΄Π° ΡΡΠΎ-ΡΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ, ΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ Π² r1 (ΡΠΎΠΎΡΠ². fildes[1]), ΡΠΎ Π±ΡΡΠ΅ΡΠΈΠ·ΡΠ΅ΡΡΡ Π΄ΠΎ 4096 Π±Π°ΠΉΡΠΎΠ² Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ. ΠΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ ΠΈΠ· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ Π² r0 (ΡΠΎΠΎΡΠ². fildes[0]), Π·Π°Π±ΠΈΡΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅.
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π΄Π²Π° (ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅) Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° (ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ Π²ΡΠ·ΠΎΠ²Π°ΠΌΠΈ fork) Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² read ΠΈ write.
Π ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ΅ Π΅ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ½Π½ΡΡ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°.
ΠΡΠ·ΠΎΠ²Ρ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° (Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ Π±ΡΡΠ΅ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ), ΠΈΠΌΠ΅ΡΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ½Π΅Ρ (Π·Π°ΠΊΡΡΡΡ Π²ΡΠ΅ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ), Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Β«ΠΊΠΎΠ½Π΅Ρ ΡΠ°ΠΉΠ»Π°Β». ΠΡΠ·ΠΎΠ²Ρ Π½Π° Π·Π°ΠΏΠΈΡΡ Π² Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΈΠ³Π½ΠΎΡΠΈΡΡΡΡΡΡ.
Π‘Π°ΠΌΠ°Ρ ΡΠ°Π½Π½ΡΡ
Π¨Π΅ΡΡΠ°Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡ Unix (1975)
ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ ΡΠΈΡΠ°ΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Unix
ΠΠ½ΠΎΠ³ΠΈΠ΅ Π³ΠΎΠ΄Ρ ΠΊΠ½ΠΈΠ³Π° Lions Π±ΡΠ»Π° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΏΠΎ ΡΠ΄ΡΡ Unix, Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌ Π²Π½Π΅ ΡΡΠ΅Π½ Bell Labs. Π₯ΠΎΡΡ Π»ΠΈΡΠ΅Π½Π·ΠΈΡ ΡΠ΅ΡΡΠΎΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ»Π° ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΡΠ΅Π»ΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄, ΠΎΠ΄Π½Π°ΠΊΠΎ Π»ΠΈΡΠ΅Π½Π·ΠΈΡ ΡΠ΅Π΄ΡΠΌΠΎΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ ΠΈΡΠΊΠ»ΡΡΠΈΠ»Π° ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠ½ΠΈΠ³Π° ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ»Π°ΡΡ Π² Π²ΠΈΠ΄Π΅ Π½Π΅Π»Π΅Π³Π°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½ΠΎΠΏΠΈΡΠ½ΡΡ ΠΊΠΎΠΏΠΈΠΉ.
Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΡΠΏΠΈΡΡ ΡΠ΅ΠΏΡΠΈΠ½ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΊΠ½ΠΈΠ³ΠΈ, Π½Π° ΠΎΠ±Π»ΠΎΠΆΠΊΠ΅ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ ΡΡΡΠ΄Π΅Π½ΡΡ Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ°. Π Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π£ΠΎΡΡΠ΅Π½Ρ Π’ΡΠΌΠΈ (ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΏΡΡΡΠΈΠ» ΠΏΡΠΎΠ΅ΠΊΡ TUHS) Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°ΡΠ°ΡΡ
ΠΠΎΠ»ΡΡΠ΅ 15 Π»Π΅Ρ Π½Π°Π·Π°Π΄ Ρ Π½Π°Π±ΡΠ°Π» ΠΊΠΎΠΏΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ Π² Lions, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΠ½Π΅ Π½Π΅ Π½ΡΠ°Π²ΠΈΠ»ΠΎΡΡ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΌΠΎΠ΅ΠΉ ΠΊΠΎΠΏΠΈΠΈ Ρ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π΄ΡΡΠ³ΠΈΡ ΠΊΠΎΠΏΠΈΠΉ. TUHS Π΅ΡΡ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»ΠΎ, ΠΈ Ρ ΠΌΠ΅Π½Ρ Π½Π΅ Π±ΡΠ»ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΡΠ°ΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠ°ΠΌ. ΠΠΎ Π² 1988-ΠΌ Ρ Π½Π°ΡΡΠ» ΡΡΠ°ΡΡΡ Π»Π΅Π½ΡΡ Ρ 9 Π΄ΠΎΡΠΎΠΆΠΊΠ°ΠΌΠΈ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ»Π° ΡΠ΅Π·Π΅ΡΠ²Π½Π°Ρ ΠΊΠΎΠΏΠΈΡ ΠΈΠ· ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ° PDP11. Π’ΡΡΠ΄Π½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠΎΠ½ΡΡΡ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π»ΠΈ ΠΎΠ½Π°, Π½ΠΎ ΡΠ°ΠΌ Π±ΡΠ»ΠΎ Π½Π΅ΠΏΠΎΠ²ΡΠ΅ΠΆΠ΄ΡΠ½Π½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ /usr/src/, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ² Π±ΡΠ»ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ 1979-ΠΌ Π³ΠΎΠ΄ΠΎΠΌ, ΡΡΠΎ ΡΠΆΠ΅ ΡΠΎΠ³Π΄Π° Π²ΡΠ³Π»ΡΠ΄Π΅Π»ΠΎ Π΄ΡΠ΅Π²Π½ΠΎΡΡΡΡ. ΠΡΠΎ Π±ΡΠ»Π° ΡΠ΅Π΄ΡΠΌΠ°Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡ ΠΈΠ»ΠΈ Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π°Ρ PWB, ΠΊΠ°ΠΊ Ρ ΡΡΠΈΡΠ°Π».
Π― Π²Π·ΡΠ» Π½Π°Ρ ΠΎΠ΄ΠΊΡ Π·Π° ΠΎΡΠ½ΠΎΠ²Ρ ΠΈ Π²ΡΡΡΠ½ΡΡ ΠΎΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π» ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΈ Π΄ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠ΅ΡΡΠΎΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ. Π§Π°ΡΡΡ ΠΊΠΎΠ΄Π° ΠΎΡΡΠ°Π»Π°ΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅, ΡΠ°ΡΡΡ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΡΠ»Π΅Π³ΠΊΠ° ΠΏΠΎΠ΄ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ, ΠΏΠΎΠΌΠ΅Π½ΡΠ² ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΡΠΎΠΊΠ΅Π½ += Π½Π° ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ =+. Π§ΡΠΎ-ΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π°Π»ΠΈΠ», Π° ΡΡΠΎ-ΡΠΎ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ, Π½ΠΎ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ.
Π ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π² ΠΎΠ½Π»Π°ΠΉΠ½Π΅ ΡΠΈΡΠ°ΡΡ Π½Π° TUHS ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΠ΅ΡΡΠΎΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ ΠΈΠ·
ΠΡΡΠ°ΡΠΈ, Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄, Π³Π»Π°Π²Π½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ Π‘-ΠΊΠΎΠ΄Π° Π΄ΠΎ ΠΏΠ΅ΡΠΈΠΎΠ΄Π° ΠΠ΅ΡΠ½ΠΈΠ³Π°Π½Π° ΠΈ Π ΠΈΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΅Π³ΠΎ ΠΊΡΠ°ΡΠΊΠΎΡΡΡ. ΠΠ΅ ΡΠ°ΠΊ ΡΠ°ΡΡΠΎ ΠΌΠ½Π΅ ΡΠ΄Π°ΡΡΡΡ Π²ΡΡΠ°Π²Π»ΡΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ ΠΊΠΎΠ΄Π° Π±Π΅Π· ΠΎΠ±ΡΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π» ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ·ΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΌΠΎΡΠΌ ΡΠ°ΠΉΡΠ΅.
Π Π½Π°ΡΠ°Π»Π΅
/*
* Max allowable buffering per pipe.
* This is also the max size of the
* file created to implement the pipe.
* If this size is bigger than 4096,
* pipes will be implemented in LARG
* files, which is probably not good.
*/
#define PIPSIZ 4096
Π Π°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° Π½Π΅ ΠΌΠ΅Π½ΡΠ»ΡΡ ΡΠΎ Π²ΡΠ΅ΠΌΡΠ½ ΡΠ΅ΡΠ²ΡΡΡΠΎΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ. ΠΠΎ Π·Π΄Π΅ΡΡ ΠΌΡ Π±Π΅Π·ΠΎ Π²ΡΡΠΊΠΎΠΉ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΠΊΠΎΠ³Π΄Π°-ΡΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΡΠ°ΠΉΠ»Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π°ΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ°!
Π§ΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ LARG-ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠΎ ΠΎΠ½ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ
ΠΠΎΡ Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² pipe
:
/*
* The sys-pipe entry.
* Allocate an inode on the root device.
* Allocate 2 file structures.
* Put it all together with flags.
*/
pipe()
{
register *ip, *rf, *wf;
int r;
ip = ialloc(rootdev);
if(ip == NULL)
return;
rf = falloc();
if(rf == NULL) {
iput(ip);
return;
}
r = u.u_ar0[R0];
wf = falloc();
if(wf == NULL) {
rf->f_count = 0;
u.u_ofile[r] = NULL;
iput(ip);
return;
}
u.u_ar0[R1] = u.u_ar0[R0]; /* wf's fd */
u.u_ar0[R0] = r; /* rf's fd */
wf->f_flag = FWRITE|FPIPE;
wf->f_inode = ip;
rf->f_flag = FREAD|FPIPE;
rf->f_inode = ip;
ip->i_count = 2;
ip->i_flag = IACC|IUPD;
ip->i_mode = IALLOC;
}
Π ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΡΡΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ, ΡΡΠΎ ΡΡΡ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ. ΠΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΠΊΠΎΠ΄Π΅ Π½Π΅ ΡΠ°ΠΊ ΠΏΡΠΎΡΡΠΎ, ΠΎΡΡΠ°ΡΡΠΈ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Β«R0
ΠΈ R1
ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
pipe()
Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΅ΡΠ΅Π· R0
ΠΈ R1
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ
Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ. falloc()
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ ΡΡΡΡΠΊΡΡΡΡ, Π½ΠΎ ΡΠ°ΠΊΠΆΠ΅ Β«Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΒ» ΡΠ΅ΡΠ΅Π· u.u_ar0[R0]
ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ. Π’ΠΎ Π΅ΡΡΡ ΠΊΠΎΠ΄ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π² r
ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΡΠΌΠΎ ΠΈΠ· u.u_ar0[R0]
ΠΏΠΎΡΠ»Π΅ Π²ΡΠΎΡΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° falloc()
.
Π€Π»Π°Π³ FPIPE
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π·Π°Π΄Π°Π»ΠΈ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ
/*
* common code for read and write calls:
* check permissions, set base, count, and offset,
* and switch out to readi, writei, or pipe code.
*/
rdwr(mode)
{
register *fp, m;
m = mode;
fp = getf(u.u_ar0[R0]);
/* β¦ */
if(fp->f_flag&FPIPE) {
if(m==FREAD)
readp(fp); else
writep(fp);
}
/* β¦ */
}
ΠΠ°ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ readp()
Π² pipe.c
ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°. ΠΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π»ΡΡΡΠ΅ Π½Π°ΡΠΈΠ½Π°Ρ Ρ writep()
. ΠΠΎΠ²ΡΠΎΡΡΡΡ, ΠΊΠΎΠ΄ ΡΡΠ»ΠΎΠΆΠ½ΠΈΠ»ΡΡ ΠΈΠ·-Π·Π° ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠ΅ΠΉ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ², Π½ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΡΡΠΈΡΡ.
writep(fp)
{
register *rp, *ip, c;
rp = fp;
ip = rp->f_inode;
c = u.u_count;
loop:
/* If all done, return. */
plock(ip);
if(c == 0) {
prele(ip);
u.u_count = 0;
return;
}
/*
* If there are not both read and write sides of the
* pipe active, return error and signal too.
*/
if(ip->i_count < 2) {
prele(ip);
u.u_error = EPIPE;
psignal(u.u_procp, SIGPIPE);
return;
}
/*
* If the pipe is full, wait for reads to deplete
* and truncate it.
*/
if(ip->i_size1 == PIPSIZ) {
ip->i_mode =| IWRITE;
prele(ip);
sleep(ip+1, PPIPE);
goto loop;
}
/* Write what is possible and loop back. */
u.u_offset[0] = 0;
u.u_offset[1] = ip->i_size1;
u.u_count = min(c, PIPSIZ-u.u_offset[1]);
c =- u.u_count;
writei(ip);
prele(ip);
if(ip->i_mode&IREAD) {
ip->i_mode =& ~IREAD;
wakeup(ip+2);
}
goto loop;
}
ΠΠ° Π²Ρ
ΠΎΠ΄ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΌΡ Ρ
ΠΎΡΠΈΠΌ Π·Π°ΠΏΠΈΡΠ°ΡΡ Π±Π°ΠΉΡΡ u.u_count
. Π‘Π½Π°ΡΠ°Π»Π° ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΠΌ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ (ΡΠΌ. Π½ΠΈΠΆΠ΅ plock
/prele
).
ΠΠ°ΡΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΡΡΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ inode. ΠΠΎΠΊΠ° ΠΎΠ±Π° ΠΊΠΎΠ½ΡΠ° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΎΡΡΠ°ΡΡΡΡ ΠΎΡΠΊΡΡΡΡΠΌΠΈ, ΡΡΡΡΡΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°Π²Π΅Π½ 2. ΠΡ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌ ΠΎΠ΄Π½Ρ ΡΡΡΠ»ΠΊΡ (ΠΈΠ· rp->f_inode
), ΡΠ°ΠΊ ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΡΡΡΡΠΈΠΊ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½ΡΡΠ΅ 2, ΡΠΎ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΡΠ°ΡΡ, ΡΡΠΎ ΡΠΈΡΠ°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°ΠΊΡΡΠ» ΡΠ²ΠΎΠΉ ΠΊΠΎΠ½Π΅Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°. ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΌΡ ΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΏΠΈΡΠ°ΡΡ Π² Π·Π°ΠΊΡΡΡΡΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ, Π° ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ. ΠΠΏΠ΅ΡΠ²ΡΠ΅ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ EPIPE
ΠΈ ΡΠΈΠ³Π½Π°Π» SIGPIPE
ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π² ΡΠ΅ΡΡΠΎΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ Unix.
ΠΠΎ Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΠΎΡΠΊΡΡΡ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΡΠ½ΠΈΠΌΠ°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈ ΠΈΠ΄ΡΠΌ ΡΠΏΠ°ΡΡ Π² Π½Π°Π΄Π΅ΠΆΠ΄Π΅, ΡΡΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΡΠΎΡΠΈΡΠ°Π΅Ρ ΠΈΠ· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ Π² Π½ΡΠΌ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ΅ΡΡΠ°. ΠΡΠΎΡΠ½ΡΠ²ΡΠΈΡΡ, ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ Π½Π°ΡΠ°Π»Ρ, ΠΎΠΏΡΡΡ Π²Π΅ΡΠ°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠΈΠΊΠ» Π·Π°ΠΏΠΈΡΠΈ.
ΠΡΠ»ΠΈ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ°, ΡΠΎ ΠΌΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² Π½Π΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ i_size1
Ρ inode’Π° (ΠΏΡΠΈ ΠΏΡΡΡΠΎΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°Π²Π΅Π½ 0) ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΊΠΎΠ½Π΅Ρ Π΄Π°Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ Π² Π½ΡΠΌ ΡΠΆΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ. ΠΡΠ»ΠΈ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΠΎΡ i_size1
Π΄ΠΎ PIPESIZ
. ΠΠ°ΡΠ΅ΠΌ ΡΠ½ΠΈΠΌΠ°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈ ΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΏΡΠΎΠ±ΡΠ΄ΠΈΡΡ Π»ΡΠ±ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΆΠ΄ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΈΠ· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ ΠΊ Π½Π°ΡΠ°Π»Ρ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΡΠ΄Π°Π»ΠΎΡΡ Π»ΠΈ Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠΎΠ»ΡΠΊΠΎ Π±Π°ΠΉΡΠΎΠ², ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π°ΠΌ Π±ΡΠ»ΠΎ Π½ΡΠΆΠ½ΠΎ. ΠΡΠ»ΠΈ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ, ΡΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΡΠΈΠΊΠ» Π·Π°ΠΏΠΈΡΠΈ.
ΠΠ±ΡΡΠ½ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ i_mode
Ρ inode’Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΉ r
, w
ΠΈ x
. ΠΠΎ Π² ΡΠ»ΡΡΠ°Π΅ Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°ΠΌΠΈ ΠΌΡ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΎΠ± ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ Π·Π°ΠΏΠΈΡΠΈ ΠΈΠ»ΠΈ ΡΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π±ΠΈΡΠΎΠ² IREAD
ΠΈ IWRITE
ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. ΠΡΠΎΡΠ΅ΡΡ Π·Π°Π΄Π°ΡΡ ΡΠ»Π°Π³ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ sleep()
, ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ, ΡΡΠΎ Π±ΡΠ΄ΡΡΠ΅ΠΌ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠ·ΠΎΠ²Π΅Ρ wakeup()
.
ΠΠ°ΡΡΠΎΡΡΠ΅Π΅ Π²ΠΎΠ»ΡΠ΅Π±ΡΡΠ²ΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π² sleep()
ΠΈ wakeup()
. ΠΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π²
/*
* Give up the processor till a wakeup occurs
* on chan, at which time the process
* enters the scheduling queue at priority pri.
* The most important effect of pri is that when
* pri<0 a signal cannot disturb the sleep;
* if pri>=0 signals will be processed.
* Callers of this routine must be prepared for
* premature return, and check that the reason for
* sleeping has gone away.
*/
sleep(chan, pri) /* β¦ */
/*
* Wake up all processes sleeping on chan.
*/
wakeup(chan) /* β¦ */
ΠΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ sleep()
Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ ΡΠ°Π·Π±ΡΠΆΠ΅Π½ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΠΎΠ²Π΅Ρ wakeup()
Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠ°Π½Π°Π»Π°. writep()
ΠΈ readp()
ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΡΡΡ ΡΠ²ΠΎΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΡΠ°ΠΊΠΈΡ
ΠΏΠ°ΡΠ½ΡΡ
Π²ΡΠ·ΠΎΠ²ΠΎΠ². ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ pipe.c
Π²ΡΠ΅Π³Π΄Π° ΠΎΡΠ΄Π°ΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ PPIPE
ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ sleep()
, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠ΅ sleep()
ΠΌΠΎΠ³ΡΡ ΠΏΡΠ΅ΡΡΠ²Π°ΡΡΡΡ ΠΏΠΎ ΡΠΈΠ³Π½Π°Π»Ρ.
Π’Π΅ΠΏΠ΅ΡΡ Ρ Π½Π°Ρ Π΅ΡΡΡ Π²ΡΡ, ΡΡΠΎΠ±Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ readp()
:
readp(fp)
int *fp;
{
register *rp, *ip;
rp = fp;
ip = rp->f_inode;
loop:
/* Very conservative locking. */
plock(ip);
/*
* If the head (read) has caught up with
* the tail (write), reset both to 0.
*/
if(rp->f_offset[1] == ip->i_size1) {
if(rp->f_offset[1] != 0) {
rp->f_offset[1] = 0;
ip->i_size1 = 0;
if(ip->i_mode&IWRITE) {
ip->i_mode =& ~IWRITE;
wakeup(ip+1);
}
}
/*
* If there are not both reader and
* writer active, return without
* satisfying read.
*/
prele(ip);
if(ip->i_count < 2)
return;
ip->i_mode =| IREAD;
sleep(ip+2, PPIPE);
goto loop;
}
/* Read and return */
u.u_offset[0] = 0;
u.u_offset[1] = rp->f_offset[1];
readi(ip);
rp->f_offset[1] = u.u_offset[1];
prele(ip);
}
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡΠ΅ ΡΠΈΡΠ°ΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ½ΠΈΠ·Ρ Π²Π²Π΅ΡΡ
. ΠΠ΅ΡΠΊΠ° Β«read and returnΒ» ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ΅ Π΅ΡΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π°Π½Π½ΡΠ΅. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ f_offset
ΡΡΠ΅Π½ΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΡ.
ΠΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΡΡΡΠΌ, Π΅ΡΠ»ΠΈ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΠΈΠ³Π»ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ i_size1
Ρ inode’Π°. ΠΡ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π½Π° 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()
Π±Π»ΠΎΠΊΠΈΡΡΡΡ inode Π΄ΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°ΠΊΠΎΠ½ΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ ΠΈΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ (ΡΠΎ Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ²ΡΡ wakeup
). plock()
ΠΈ prele()
ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΡΠΎΡΡΠΎ: Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° Π²ΡΠ·ΠΎΠ²ΠΎΠ² sleep
ΠΈ wakeup
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π°ΠΌ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π°ΡΡ Π»ΡΠ±ΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π½ΡΠΆΠ½Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ½ΡΠ»ΠΈ:
/*
* Lock a pipe.
* If its already locked, set the WANT bit and sleep.
*/
plock(ip)
int *ip;
{
register *rp;
rp = ip;
while(rp->i_flag&ILOCK) {
rp->i_flag =| IWANT;
sleep(rp, PPIPE);
}
rp->i_flag =| ILOCK;
}
/*
* Unlock a pipe.
* If WANT bit is on, wakeup.
* This routine is also used to unlock inodes in general.
*/
prele(ip)
int *ip;
{
register *rp;
rp = ip;
rp->i_flag =& ~ILOCK;
if(rp->i_flag&IWANT) {
rp->i_flag =& ~IWANT;
wakeup(rp);
}
}
Π‘Π½Π°ΡΠ°Π»Π° Ρ Π½Π΅ ΠΌΠΎΠ³ ΠΏΠΎΠ½ΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ readp()
Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ prele(ip)
Π΄ΠΎ Π²ΡΠ·ΠΎΠ²Π° wakeup(ip+1)
. ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ writep()
Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π² ΡΠ²ΠΎΡΠΌ ΡΠΈΠΊΠ»Π΅, ΡΡΠΎ plock(ip)
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅, Π΅ΡΠ»ΠΈ readp()
Π΅ΡΡ Π½Π΅ ΡΠ½ΡΠ» ΡΠ²ΠΎΠΉ Π±Π»ΠΎΠΊ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ΄ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. ΠΡΠ»ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° wakeup()
, ΡΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΎΠ½ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΡΠΏΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΊΠ°ΠΊ Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΊ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ sched()
Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΠ»Π° Π΅Π³ΠΎ. Π’Π°ΠΊ ΡΡΠΎ readp()
Π²ΡΠ·ΡΠ²Π°Π΅Ρ wakeup()
, ΡΠ½ΠΈΠΌΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, Π·Π°Π΄Π°ΡΡ IREAD
ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ sleep(ip+2)
β Π²ΡΡ ΡΡΠΎ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ writep()
Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΡΠΈΠΊΠ».
ΠΠ° ΡΡΠΎΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠ² Π² ΡΠ΅ΡΡΠΎΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ Π·Π°ΠΊΠΎΠ½ΡΠ΅Π½ΠΎ. ΠΡΠΎΡΡΠΎΠΉ ΠΊΠΎΠ΄, Π΄Π°Π»Π΅ΠΊΠΎ ΠΈΠ΄ΡΡΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ.
Xv6, ΠΏΡΠΎΡΡΠΎΠ΅ Unix-ΠΎΠ±ΡΠ°Π·Π½ΠΎΠ΅ ΡΠ΄ΡΠΎ
ΠΠ° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΄ΡΠ°
Π ΠΊΠΎΠ΄Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ ΠΏΠΎΠ½ΡΡΠ½Π°Ρ ΠΈ ΠΏΡΠΎΠ΄ΡΠΌΠ°Π½Π½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ pipealloc()
:
#define PIPESIZE 512
struct pipe {
struct spinlock lock;
char data[PIPESIZE];
uint nread; // number of bytes read
uint nwrite; // number of bytes written
int readopen; // read fd is still open
int writeopen; // write fd is still open
};
int
pipealloc(struct file **f0, struct file **f1)
{
struct pipe *p;
p = 0;
*f0 = *f1 = 0;
if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0)
goto bad;
if((p = (struct pipe*)kalloc()) == 0)
goto bad;
p->readopen = 1;
p->writeopen = 1;
p->nwrite = 0;
p->nread = 0;
initlock(&p->lock, "pipe");
(*f0)->type = FD_PIPE;
(*f0)->readable = 1;
(*f0)->writable = 0;
(*f0)->pipe = p;
(*f1)->type = FD_PIPE;
(*f1)->readable = 0;
(*f1)->writable = 1;
(*f1)->pipe = p;
return 0;
bad:
if(p)
kfree((char*)p);
if(*f0)
fileclose(*f0);
if(*f1)
fileclose(*f1);
return -1;
}
pipealloc()
Π·Π°Π΄Π°ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΡΡΠ½ΠΊΡΠΈΠΈ piperead()
, pipewrite()
ΠΈ pipeclose()
. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² sys_pipe
ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΡΠΊΠΎΠΉ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π²
Linux 0.01
ΠΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Linux 0.01. ΠΡΠ΄Π΅Ρ ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ·ΡΡΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠ² Π² Π΅Π³ΠΎ fs
/pipe.c
. ΠΠ΄Π΅ΡΡ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ inode, Π½ΠΎ ΡΠ°ΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ C. ΠΡΠ»ΠΈ Π²Ρ ΠΏΡΠΎΠ΄ΡΠ°Π»ΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ΄ ΡΠ΅ΡΡΠΎΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΈΠΈ, ΡΠΎ Π·Π΄Π΅ΡΡ Π²Ρ Π½Π΅ ΠΈΡΠΏΡΡΠ°Π΅ΡΠ΅ ΡΡΡΠ΄Π½ΠΎΡΡΠ΅ΠΉ. Π’Π°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΡΠ½ΠΊΡΠΈΡ write_pipe()
:
int write_pipe(struct m_inode * inode, char * buf, int count)
{
char * b=buf;
wake_up(&inode->i_wait);
if (inode->i_count != 2) { /* no readers */
current->signal |= (1<<(SIGPIPE-1));
return -1;
}
while (count-->0) {
while (PIPE_FULL(*inode)) {
wake_up(&inode->i_wait);
if (inode->i_count != 2) {
current->signal |= (1<<(SIGPIPE-1));
return b-buf;
}
sleep_on(&inode->i_wait);
}
((char *)inode->i_size)[PIPE_HEAD(*inode)] =
get_fs_byte(b++);
INC_PIPE( PIPE_HEAD(*inode) );
wake_up(&inode->i_wait);
}
wake_up(&inode->i_wait);
return b-buf;
}
ΠΠ°ΠΆΠ΅ Π½Π΅ Π³Π»ΡΠ΄Ρ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΡΡΡΠΊΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ, ΠΊΠ°ΠΊ ΡΡΡΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ inode ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ Π»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°ΠΏΠΈΡΠΈ ΠΊ SIGPIPE
. ΠΠΎΠΌΠΈΠΌΠΎ ΠΏΠΎΠ±Π°ΠΉΡΠΎΠ²ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Ρ Π²ΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΌΠΈ ΠΈΠ΄Π΅ΡΠΌΠΈ. ΠΠ°ΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ° sleep_on
/wake_up
Π½Π΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊΠΎΠΉ ΡΡΠΆΠ΅ΡΠΎΠ΄Π½ΠΎΠΉ.
Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΄ΡΠ° Linux, FreeBSD, NetBSD, OpenBSD
Π― Π±ΡΡΡΡΠΎ ΠΏΡΠΎΠ±Π΅ΠΆΠ°Π»ΡΡ ΠΏΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ ΡΠ΄ΡΠ°ΠΌ. ΠΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ ΡΠΆΠ΅ Π½Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΈΡΠΊΠ° (Π½Π΅ ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ). Π Linux ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. Π Ρ ΠΎΡΡ ΡΡΠΈ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ BSD-ΡΠ΄ΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» Π½Π°ΠΏΠΈΡΠ°Π½ ΠΠΆΠΎΠ½ΠΎΠΌ ΠΠ°ΠΉΡΠΎΠ½ΠΎΠΌ, Π·Π° ΠΏΡΠΎΡΠ΅Π΄ΡΠΈΠ΅ Π³ΠΎΠ΄Ρ ΠΎΠ½ΠΈ ΡΡΠ°Π»ΠΈ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠΈΠ»ΡΠ½ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π°.
Π§ΡΠΎΠ±Ρ ΡΠΈΡΠ°ΡΡ fs
/pipe.c
(Π½Π° Linux) ΠΈΠ»ΠΈ sys
/kern
/sys_pipe.c
(Π½Π° *BSD), ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π°ΡΡΠΎΡΡΠ°Ρ ΡΠ°ΠΌΠΎΠΎΡΠ΄Π°ΡΠ°. Π‘Π΅Π³ΠΎΠ΄Π½Ρ Π² ΠΊΠΎΠ΄Π΅ Π²Π°ΠΆΠ½Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ°ΠΊΠΈΡ
ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠ°ΠΊ Π²Π΅ΠΊΡΠΎΡΠ½ΡΠ΅ ΠΈ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°. Π ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ, Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ΄ΡΠ° β Π²ΡΡ ΡΡΠΎ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ°Π·Π½ΠΈΡΡΡ. ΠΡΠΎ Π½Π΅ ΡΠΎ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π²ΡΠ·Π°ΠΌ Π΄Π»Ρ Π²Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΡΡΡΠ° ΠΏΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΌ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌ.
Π Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΌΠ½Π΅ Π±ΡΠ»ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΡΠ°ΡΠΊΠΎΠΏΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ°ΡΠΈΠ½Π½ΡΡ
ΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ SIGPIPE
ΠΈ Π²ΠΎΠ·Π²ΡΠ°Ρ EPIPE
ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² Π·Π°ΠΊΡΡΡΡΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ) Π²ΠΎ Π²ΡΠ΅Ρ
ΡΡΠΈΡ
, ΡΠ°ΠΊΠΈΡ
ΡΠ°Π·Π½ΡΡ
, ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΡΠ΄ΡΠ°Ρ
. ΠΠ΅ΡΠΎΡΡΠ½ΠΎ, Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ²ΠΈΠΆΡ Π²ΠΆΠΈΠ²ΡΡ ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ PDP-11, Π½ΠΎ Π΅ΡΡ Π΅ΡΡΡ ΡΠ΅ΠΌΡ ΠΏΠΎΡΡΠΈΡΡΡΡ Π½Π° ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» Π½Π°ΠΏΠΈΡΠ°Π½ Π·Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π»Π΅Ρ Π΄ΠΎ ΠΌΠΎΠ΅Π³ΠΎ ΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ.
ΠΠ°ΠΏΠΈΡΠ°Π½Π½Π°Ρ ΠΠΈΠ²ΠΈ ΠΠ°ΠΏΡΡΠΎΠΌ Π² 2011-ΠΌ Π³ΠΎΠ΄Ρ ΡΡΠ°ΡΡΡ Β«
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com