ΠΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ° ΠΎΠΏΠΈΡΡΠ²Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ Π²ΠΎ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Unix. ΠΠ΅Π² ΠΌΠ°Π»ΠΊΡ ΡΠ°Π·ΠΎΡΠ°ΡΠ°Π½ ΡΡΠΎ Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π΅ΡΠ½Π°ΡΠ° ΡΡΠ°ΡΠΈΡΠ° ΡΠΎ Π½Π°ΡΠ»ΠΎΠ² β
ΠΠ° ΡΡΠΎ Π·Π±ΠΎΡΡΠ²Π°ΠΌΠ΅?
Π¦Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅ ΡΠ΅ βΠ²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ Π½Π°ΡΠ²Π°ΠΆΠ½ΠΈΠΎΡ ΠΈΠ·ΡΠΌ Π²ΠΎ Unixβ - Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠΊΠ° ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠΈΠ»ΠΎΠ·ΠΎΡΠΈΡΠ° Π½Π° Unix Π·Π° ΡΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΠΌΠ°Π»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΈ ΠΏΠΎΠ·Π½Π°ΡΠΈΠΎΡ ΡΠ»ΠΎΠ³Π°Π½ ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Π½Π°ΡΠ° Π»ΠΈΠ½ΠΈΡΠ°:
$ echo hello | wc -c
6
ΠΠ²Π°Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π·Π°Π²ΠΈΡΠΈ ΠΎΠ΄ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΠΎΡ ΠΏΠΎΠ²ΠΈΠΊ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ ΠΎΠ΄ ΡΠ°Π΄ΡΠΎΡΠΎ pipe
, ΡΡΠΎ Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠΈΡΠ΅ ΡΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°
Π¦Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π°Π°Ρ Π΅Π΄Π½ΠΎΠ½Π°ΡΠΎΡΠ΅Π½ ΠΊΠ°Π½Π°Π» Π·Π° ΠΌΠ΅ΡΡΠΏΡΠΎΡΠ΅ΡΠ½Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΠ°. ΠΠ°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ ΠΈΠΌΠ° Π²Π»Π΅Π· (ΠΊΡΠ°Ρ Π·Π° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΠ΅) ΠΈ ΠΈΠ·Π»Π΅Π· (ΠΊΡΠ°Ρ Π·Π° ΡΠΈΡΠ°ΡΠ΅). ΠΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π·Π°ΠΏΠΈΡΠ°Π½ΠΈ Π½Π° Π²Π»Π΅Π·ΠΎΡ Π½Π° Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠΈΡΠ°Π°Ρ Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ.
ΠΠ°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ ΡΠ΅ ΡΠΎΠ·Π΄Π°Π²Π° ΡΠΎ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΡΠ΅
pipe(2)
, ΠΊΠΎΡ Π²ΡΠ°ΡΠ° Π΄Π²Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ: Π΅Π΄Π½ΠΈΠΎΡ ΡΠ΅ ΠΎΠ΄Π½Π΅ΡΡΠ²Π° Π½Π° Π²Π»Π΅Π·ΠΎΡ Π½Π° Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ, Π²ΡΠΎΡΠΈΠΎΡ Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ.
ΠΠ·Π»Π΅Π·ΠΎΡ Π·Π° ΡΡΠ°Π³Π° ΠΎΠ΄ Π³ΠΎΡΠ½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π³ΠΎ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½ΠΈΠ· Π½Π΅Π³ΠΎ ΠΎΠ΄ Π΅Π΄Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ Π΄ΠΎ Π΄ΡΡΠ³:
$ strace -qf -e execve,pipe,dup2,read,write
sh -c 'echo hello | wc -c'
execve("/bin/sh", ["sh", "-c", "echo hello | wc -c"], β¦)
pipe([3, 4]) = 0
[pid 2604795] dup2(4, 1) = 1
[pid 2604795] write(1, "hellon", 6) = 6
[pid 2604796] dup2(3, 0) = 0
[pid 2604796] execve("/usr/bin/wc", ["wc", "-c"], β¦)
[pid 2604796] read(0, "hellon", 16384) = 6
[pid 2604796] write(1, "6n", 2) = 2
Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅Ρ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π° pipe()
Π·Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΡΠ΅ ΠΏΡΠΈΠΊΠ°ΡΠ΅Π½ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ. ΠΠ΄Π΅Π½ Π΄Π΅ΡΠ΅ ΠΏΡΠΎΡΠ΅Ρ ΠΏΠΈΡΡΠ²Π° Π½Π° Π΅Π΄Π΅Π½ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π° Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ Π³ΠΈ ΡΠΈΡΠ° ΠΈΡΡΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ Π΄ΡΡΠ³ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ. Π¨ΠΊΠΎΠ»ΠΊΠ°ΡΠ° Π³ΠΈ βΠΏΡΠ΅ΠΈΠΌΠ΅Π½ΡΠ²Π°β Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈΡΠ΅ 2 ΠΈ 3 ΡΠΎ dup4 Π·Π° Π΄Π° ΠΎΠ΄Π³ΠΎΠ²Π°ΡΠ°Π°Ρ Π½Π° stdin ΠΈ stdout.
ΠΠ΅Π· ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ, ΡΠΊΠΎΠ»ΠΊΠ°ΡΠ° Π±ΠΈ ΠΌΠΎΡΠ°Π»Π° Π΄Π° Π³ΠΎ Π·Π°ΠΏΠΈΡΠ΅ ΠΈΠ·Π»Π΅Π·ΠΎΡ ΠΎΠ΄ Π΅Π΄Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ Π²ΠΎ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΈ Π΄Π° Π³ΠΎ ΠΏΡΠ΅Π½Π΅ΡΠ΅ Π²ΠΎ Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ Π·Π° Π΄Π° Π³ΠΈ ΠΏΡΠΎΡΠΈΡΠ° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΎΠ΄ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ°. ΠΠ°ΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ°, ΡΠ΅ ΠΏΠΎΡΡΠΎΡΠΈΠΌΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ΡΡΡΡΠΈ ΠΈ ΠΏΡΠΎΡΡΠΎΡ Π½Π° Π΄ΠΈΡΠΊΠΎΡ. Π‘Π΅ΠΏΠ°ΠΊ, ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅ ΡΠ΅ Π΄ΠΎΠ±ΡΠΈ Π·Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ ΡΠ°ΠΌΠΎ ΠΈΠ·Π±Π΅Π³Π½ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΈΠ²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ:
ΠΠΊΠΎ Π½Π΅ΠΊΠΎΡ ΠΏΡΠΎΡΠ΅Ρ ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ Π΄Π° ΠΏΡΠΎΡΠΈΡΠ° ΠΎΠ΄ ΠΏΡΠ°Π·Π΅Π½ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄, ΡΠΎΠ³Π°Ρ
read(2)
ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠ° Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π½Π΅ Π±ΠΈΠ΄Π°Ρ Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ. ΠΠΊΠΎ Π½Π΅ΠΊΠΎΡ ΠΏΡΠΎΡΠ΅Ρ ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ Π΄Π° Π·Π°ΠΏΠΈΡΠ΅ Π½Π° ΡΠ΅Π»ΠΎΡΠ΅Π½ Π³Π°ΡΠΎΠ²ΠΎΠ΄, ΡΠΎΠ³Π°Ρwrite(2)
ΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠ° Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°Π°Ρ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ Π·Π° Π΄Π° ΡΠ΅ Π·Π°Π²ΡΡΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ.
ΠΠ°ΠΊΠΎ ΠΈ Π±Π°ΡΠ°ΡΠ΅ΡΠΎ POSIX, ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½Π° ΠΎΡΠΎΠ±ΠΈΠ½Π°: ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π΄ΠΎ Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ Π΄ΠΎ PIPE_BUF
Π±Π°ΡΡΠΈ (Π½Π°ΡΠΌΠ°Π»ΠΊΡ 512) ΠΌΠΎΡΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ Π°ΡΠΎΠΌΡΠΊΠΈ Π·Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π΄Π° ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°Π°Ρ Π΅Π΄Π½ΠΈ ΡΠΎ Π΄ΡΡΠ³ΠΈ ΠΏΡΠ΅ΠΊΡ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ Π½Π° Π½Π°ΡΠΈΠ½ Π½Π° ΠΊΠΎΡ Π½ΠΎΡΠΌΠ°Π»Π½ΠΈΡΠ΅ Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ (ΠΊΠΎΠΈ Π½Π΅ Π΄Π°Π²Π°Π°Ρ ΡΠ°ΠΊΠ²ΠΈ Π³Π°ΡΠ°Π½ΡΠΈΠΈ) Π½Π΅ ΠΌΠΎΠΆΠ°Ρ.
Π‘ΠΎ ΠΎΠ±ΠΈΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ Π·Π°ΠΏΠΈΡΠ΅ ΡΠ΅Π»ΠΈΠΎΡ Π½Π΅Π³ΠΎΠ² ΠΈΠ·Π»Π΅Π· ΠΈ Π΄Π° Π³ΠΎ ΠΏΡΠ΅Π΄Π°Π΄Π΅ Π½Π° Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ. ΠΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ Π²ΠΎ ΡΠ²ΡΠ΄ ΠΏΠ°ΡΠ°Π»Π΅Π»Π΅Π½ ΡΠ΅ΠΆΠΈΠΌ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π½Π°Π΄Π²ΠΎΡΠ΅ΡΠ΅Π½ ΡΠΈΠ³Π½Π°Π»Π΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ (ΠΊΠ°ΠΊΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡ) Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠΈΡΠ°Π°Ρ ΠΌΠ΅ΡΡΡΠ΅Π±Π½ΠΎ Π·Π° Π·Π°Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ ΠΈΠ»ΠΈ ΡΠΈΡΠ°ΡΠ΅ΡΠΎ. Π’ΡΠ°Π½ΡΠΏΠΎΡΡΠ΅ΡΠΈΡΠ΅ Π½Π΅ ΡΠΏΠ°ΡΡΠ²Π°Π°Ρ ΠΎΠ΄ ΡΠ΅ΡΠ° ΠΎΠ²Π°Π° ΠΌΠ°ΠΊΠ°.
Π¨ΡΠΎ Π±Π°ΡΠ°ΠΌΠ΅?
ΠΠ΅ Π²ΠΈ ΠΎΠ±ΡΠ°ΡΠ½Π°ΠΌ Π½Π° ΠΏΡΡΡΠΈ Π·Π° ΠΏΠΎΠ»Π΅ΡΠ½ΠΎ Π΄Π° Π·Π°ΠΌΠΈΡΠ»ΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅Ρ. ΠΠ΅ ΡΡΠ΅Π±Π° Π΄Π° Π΄ΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π±Π°ΡΠ΅Ρ ΠΈ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° ΡΠΎΡΡΠΎΡΠ±Π° Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ°. ΠΠ΅ Π²ΠΈ ΡΡΠ΅Π±Π°Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ ΠΈ ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ Π±Π°ΡΠ΅ΡΠΎΡ. ΠΠ΅ Π²ΠΈ ΡΡΠ΅Π±Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅ Π·Π° ΡΠΈΡΠ°ΡΠ΅ ΠΈ ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π½Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ. Π Π±ΡΠ°Π²ΠΈΡΠ΅ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π·Π° ΡΠΏΡΠΎΠ²Π΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠΎΡΠ΅Π±Π½ΠΎΡΠΎ ΠΎΠ΄Π½Π΅ΡΡΠ²Π°ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΠΏΠΎΠ³ΠΎΡΠ΅.
Π‘Π΅Π³Π° ΡΠΌΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΈ Π΄Π° Π³ΠΎ ΠΈΡΠΏΠΈΡΠ°ΠΌΠ΅ ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ ΠΏΠΎΠ΄ ΡΠΈΠ»Π½ΠΎ ΡΠ²Π΅ΡΠ»ΠΎ Π½Π° ΡΠ²Π΅ΡΠΈΠ»ΠΊΠ°ΡΠ° Π·Π° Π΄Π° Π³ΠΎ ΠΏΠΎΡΠ²ΡΠ΄ΠΈΠΌΠ΅ ΠΈΠ»ΠΈ ΠΎΡΡΡΠ»ΠΈΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ Π½Π΅ΡΠ°ΡΠ΅Π½ ΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ ΠΌΠΎΠ΄Π΅Π». ΠΠΎ, ΡΠ΅ΠΊΠΎΠ³Π°Ρ Π±ΠΈΠ΄Π΅ΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΈ Π·Π° Π½Π΅ΠΎΡΠ΅ΠΊΡΠ²Π°Π½ΠΎΡΠΎ.
ΠΠ°Π΄Π΅ Π±Π°ΡΠ°ΠΌΠ΅?
ΠΠ΅ Π·Π½Π°ΠΌ ΠΊΠ°Π΄Π΅ ΡΠ΅ Π½Π°ΠΎΡΠ° ΠΌΠΎΡΠΎΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΊ ΠΎΠ΄ ΠΏΠΎΠ·Π½Π°ΡΠ°ΡΠ° ΠΊΠ½ΠΈΠ³Π°.
Π’Π°Π»ΠΊΠ°ΡΠ΅ΡΠΎ Π½ΠΈΠ· Π°ΡΡ ΠΈΠ²ΠΈΡΠ΅ Π½Π° TUHS Π΅ ΠΊΠ°ΠΊΠΎ ΠΏΠΎΡΠ΅ΡΠ° Π½Π° ΠΌΡΠ·Π΅Ρ. ΠΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° Π·Π°Π΅Π΄Π½ΠΈΡΠΊΠ° ΠΈΡΡΠΎΡΠΈΡΠ° ΠΈ ΠΈΠΌΠ°ΠΌ ΠΏΠΎΡΠΈΡ Π·Π° Π³ΠΎΠ΄ΠΈΠ½ΠΈΡΠ΅ Π½Π°ΠΏΠΎΡ Π΄Π° Π³ΠΎ ΠΏΠΎΠ²ΡΠ°ΡΠ°ΠΌ ΡΠ΅Π»ΠΈΠΎΡ ΠΎΠ²ΠΎΡ ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π» ΠΌΠ°Π»ΠΊΡ ΠΏΠΎ ΠΌΠ°Π»ΠΊΡ ΠΎΠ΄ ΡΡΠ°ΡΠΈΡΠ΅ ΠΊΠ°ΡΠ΅ΡΠΈ ΠΈ ΠΎΡΠΏΠ΅ΡΠ°ΡΠΎΡΠΈ. Π ΡΠ°Ρ ΡΡΠΌ Π°ΠΊΡΡΠ½ΠΎ ΡΠ²Π΅ΡΠ΅Π½ Π·Π° ΠΎΠ½ΠΈΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈ ΡΡΠΎ ΡΓ¨ ΡΡΡΠ΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠ²Π°Π°Ρ.
ΠΡΠΊΠ°ΠΊΠΎ ΡΠ° Π·Π°Π΄ΠΎΠ²ΠΎΠ»ΠΈΠ²ΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΡΡΠ±ΠΎΠΏΠΈΡΠ½ΠΎΡΡ Π·Π° Π°Π½ΡΠΈΡΠΊΠ°ΡΠ° ΠΈΡΡΠΎΡΠΈΡΠ° Π½Π° ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΡΠ΅ ΡΠ°Π΄ΡΠ° Π·Π° ΡΠΏΠΎΡΠ΅Π΄Π±Π°.
ΠΠ°ΡΠ΅ΠΌ, pipe
Π΅ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ Π±ΡΠΎΡ 42 Π²ΠΎ ΡΠ°Π±Π΅Π»Π°ΡΠ° sysent[]
. Π‘Π»ΡΡΠ°ΡΠ½ΠΎΡΡ?
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π°Π»Π½ΠΈ Unix ΠΊΠ΅ΡΠ½Π΅Π»ΠΈ (1970β1974)
ΠΠ΅ Π½Π°ΡΠ΄ΠΎΠ² Π½ΠΈΠΊΠ°ΠΊΠ²Π° ΡΡΠ°Π³Π° pipe(2)
Π½ΠΈΡΡ Π²ΠΎ
Π’Π£Π₯Π‘ Π³ΠΎ ΡΠ²ΡΠ΄ΠΈ ΡΠΎΠ°
Π’ΡΠ΅ΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix Π±Π΅ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° ΡΠΎ ΠΊΠ΅ΡΠ½Π΅Π» Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π²ΠΎ Π°ΡΠ΅ΠΌΠ±Π»Π΅Ρ, Π½ΠΎ ΠΈ ΠΏΡΠ²Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° ΡΠΎ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ. ΠΠΎ ΡΠ΅ΠΊΠΎΡ Π½Π° 1973 Π³ΠΎΠ΄ΠΈΠ½Π°, ΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΡΠ΅ΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅, ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π±Π΅ΡΠ΅ ΠΏΡΠ΅ΠΏΠΈΡΠ°Π½ Π²ΠΎ C ΠΈ ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠΎΠ΄ΠΈ ΡΠ΅ΡΠ²ΡΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix.
ΠΠ΄Π΅Π½ ΡΠΈΡΠ°ΡΠ΅Π» ΠΏΡΠΎΠ½Π°ΡΠΎΠ» ΡΠΊΠ΅Π½ΠΈΡΠ°ΡΠ΅ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Π²ΠΎ ΠΊΠΎΡ ΠΠ°Π³ ΠΠ΅ΠΊΠΈΠ»ΡΠΎΡ ΡΠ° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΈΠ΄Π΅ΡΠ°ΡΠ° Π·Π° βΠΏΠΎΠ²ΡΠ·ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΊΠ°ΠΊΠΎ Π³ΡΠ°Π΄ΠΈΠ½Π°ΡΡΠΊΠΎ ΡΡΠ΅Π²ΠΎβ.
ΠΠΎ ΠΊΠ½ΠΈΠ³Π°ΡΠ° Π½Π° ΠΡΠ°ΡΠ°Π½ ΠΠ΅ΡΠ½ΠΈΠ³Π°Π½
ΠΠΎΠ³Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈ Unix, ΠΌΠΎΡΠ°ΡΠ° ΡΡΡΠ°ΡΡ Π·Π° ΠΊΠΎΡΡΡΠΈΠ½ΠΈ ΠΌΠ΅ Π½Π°ΡΠ΅ΡΠ° Π΄Π° ΠΏΠΎΠ±Π°ΡΠ°ΠΌ ΠΎΠ΄ Π°Π²ΡΠΎΡΠΎΡ Π½Π° ΠΠ‘, ΠΠ΅Π½ Π’ΠΎΠΌΠΏΡΠΎΠ½, Π΄Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π·Π°ΠΏΠΈΡΠ°Π½ΠΈ Π²ΠΎ Π½Π΅ΠΊΠΎΡ ΠΏΡΠΎΡΠ΅Ρ Π΄Π° ΠΎΠ΄Π°Ρ Π½Π΅ ΡΠ°ΠΌΠΎ Π΄ΠΎ ΡΡΠ΅Π΄ΠΎΡ, ΡΡΠΊΡ ΠΈ Π΄ΠΎ ΠΈΠ·Π»Π΅Π·ΠΎΡ ΠΎΠ΄ Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ. ΠΠ΅Π½ ΠΌΠΈΡΠ»Π΅ΡΠ΅ Π΄Π΅ΠΊΠ° ΡΠΎΠ° Π΅ ΠΌΠΎΠΆΠ½ΠΎ. Π‘Π΅ΠΏΠ°ΠΊ, ΠΊΠ°ΠΊΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡ, ΡΠΎΡ ΡΠ°ΠΊΠ°ΡΠ΅ ΡΠ΅ΠΊΠΎΡΠ° ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ Π΄Π° ΠΈΠ³ΡΠ° Π·Π½Π°ΡΠ°ΡΠ½Π° ΡΠ»ΠΎΠ³Π°. ΠΠ°Π»ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎΡΠΎ ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΏΠΎΠΌΠ΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π½Π°Π²ΠΈΡΡΠΈΠ½Π° Π΅ Π³ΠΎΠ»Π΅ΠΌΠ° ΠΏΡΠ΅Π΄Π½ΠΎΡΡ Π²ΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ Π²ΠΎ ΡΡΠ΅Π΄Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°? Π Π΄ΡΡΠΈ ΠΊΠΎΠ³Π° Π΄Π°Π΄ΠΎΠ² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΏΡΠ΅Π΄Π»ΠΎΠ³ ΡΠΎ ΠΏΡΠΈΠ²Π»Π΅ΡΠ½ΠΎΡΠΎ ΠΈΠΌΠ΅ βΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄β ΠΈ ΠΎΠΏΠΈΡ Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠ°ΡΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅, ΠΠ΅Π½ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ°: βΠΠ΅ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Π°ΠΌ ΡΠΎΠ°!β.
Π Π½Π°ΠΏΡΠ°Π²ΠΈ. ΠΠ΄Π½Π° ΡΡΠ΄Π±ΠΎΠ½ΠΎΡΠ½Π° Π²Π΅ΡΠ΅Ρ, ΠΠ΅Π½ Π³ΠΈ ΡΠΌΠ΅Π½ΠΈ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΈ ΡΠΊΠΎΠ»ΠΊΠ°, ΠΏΠΎΠΏΡΠ°Π²ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° Π΄Π° Π³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΠ΄ΠΈΠ·ΠΈΡΠ° Π½Π°ΡΠΈΠ½ΠΎΡ Π½Π° ΠΏΡΠΈΡΠ°ΡΠ°ΡΠ΅ Π½Π° Π²Π»Π΅Π·ΠΎΡ (ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΡΠ΄Π΅ ΠΎΠ΄ Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ) ΠΈ Π³ΠΈ ΡΠΌΠ΅Π½ΠΈ ΠΈΠΌΠΈΡΠ°ΡΠ° Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈΡΠ΅. Π‘Π»Π΅Π΄Π½ΠΈΠΎΡ Π΄Π΅Π½, ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅ Π±Π΅Π° ΠΌΠ½ΠΎΠ³Ρ ΡΠΈΡΠΎΠΊΠΎ ΠΊΠΎΡΠΈΡΡΠ΅Π½ΠΈ Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅. ΠΠΎ ΠΊΡΠ°ΡΠΎΡ Π½Π° Π½Π΅Π΄Π΅Π»Π°ΡΠ°, ΡΠ΅ΠΊΡΠ΅ΡΠ°ΡΠΈΡΠ΅ Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠ΅Π° Π·Π° Π΄Π° ΠΈΡΠΏΡΠ°ΡΠ°Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ ΠΎΠ΄ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ Π½Π° ΡΠ΅ΠΊΡΡ Π΄ΠΎ ΠΏΠ΅ΡΠ°ΡΠ°ΡΠΎΡ. ΠΠ΅ΡΡΠΎ ΠΏΠΎΠ΄ΠΎΡΠ½Π°, ΠΠ΅Π½ Π³ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΠΎΡ API ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠ°ΡΠ° Π·Π° Π·Π°Π²ΠΈΡΠΊΡΠ²Π°ΡΠ΅ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ ΡΠΎ ΠΏΠΎΡΠΈΡΡΠΈ ΠΊΠΎΠ½Π²Π΅Π½ΡΠΈΠΈ ΠΊΠΎΠΈ ΠΎΡΡΠΎΠ³Π°Ρ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ.
ΠΠ° ΠΆΠ°Π», ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π·Π° ΡΡΠ΅ΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Unix ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π΅ ΠΈΠ·Π³ΡΠ±Π΅Π½. Π ΠΈΠ°ΠΊΠΎ Π³ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ°Π΄ΡΠΎΡΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ Π²ΠΎ C
ΠΠΌΠ°ΠΌΠ΅ ΡΠ΅ΠΊΡΡ Π·Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π·Π° pipe(2)
ΠΎΠ΄ Π΄Π²Π΅ΡΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΡΠ°, ΠΏΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ ΡΠΎ ΠΏΡΠ΅Π±Π°ΡΡΠ²Π°ΡΠ΅ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° pipe(2)
Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π° Π²ΠΎ Π°ΡΠ΅ΠΌΠ±Π»Π΅Ρ ΠΈ Π²ΡΠ°ΡΠ° ΡΠ°ΠΌΠΎ Π΅Π΄Π΅Π½ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, Π½ΠΎ Π²Π΅ΡΠ΅ ΡΠ° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΠΎΡΠ΅ΠΊΡΠ²Π°Π½Π°ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ:
Π‘ΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ ΡΠ΅Π²ΠΊΠ° ΡΠΎΠ·Π΄Π°Π²Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π²Π»Π΅Π·/ΠΈΠ·Π»Π΅Π· Π½Π°ΡΠ΅ΡΠ΅Π½ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄. ΠΠΏΠΈΡΠΎΡ Π½Π° Π²ΡΠ°ΡΠ΅Π½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° ΡΠΈΡΠ°ΡΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΠ΅. ΠΠΎΠ³Π° Π½Π΅ΡΡΠΎ ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ΅ Π²ΠΎ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ, ΡΠΎΡ ΡΠ°ΠΌΠΏΠΎΠ½ΠΈΡΠ° Π΄ΠΎ 504 Π±Π°ΡΡΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΏΠΎ ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π΅ ΡΡΡΠΏΠ΅Π½Π΄ΠΈΡΠ°Π½. ΠΡΠΈ ΡΠΈΡΠ°ΡΠ΅ ΠΎΠ΄ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ, ΡΠ΅ Π·Π΅ΠΌΠ°Π°Ρ Π±Π°ΡΠ΅ΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
ΠΠΎ ΡΠ»Π΅Π΄Π½Π°ΡΠ° Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π±Π΅ΡΠ΅ ΠΏΡΠ΅ΠΏΠΈΡΠ°Π½ Π²ΠΎ C, ΠΈ pipe(fildes)
"
Π‘ΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ ΡΠ΅Π²ΠΊΠ° ΡΠΎΠ·Π΄Π°Π²Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π²Π»Π΅Π·/ΠΈΠ·Π»Π΅Π· Π½Π°ΡΠ΅ΡΠ΅Π½ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄. ΠΡΠ°ΡΠ΅Π½ΠΈΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅ Π·Π° ΡΠΈΡΠ°ΡΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΠ΅. ΠΠΎΠ³Π° Π½Π΅ΡΡΠΎ ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ΅ Π²ΠΎ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ, ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΡ Π²ΡΠ°ΡΠ΅Π½ Π²ΠΎ r1 (ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ Fildes[1]), Π·Π°ΡΡΠ²Π°Π½ Π΄ΠΎ 4096 Π±Π°ΡΡΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΏΠΎ ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π΅ ΡΡΡΠΏΠ΅Π½Π΄ΠΈΡΠ°Π½. ΠΡΠΈ ΡΠΈΡΠ°ΡΠ΅ ΠΎΠ΄ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΡ Π²ΡΠ°ΡΠ΅Π½ Π²ΠΎ r0 (ΠΎΠ΄Π½ΠΎΡΠ½ΠΎ Fildes[0]) Π³ΠΈ Π·Π΅ΠΌΠ° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅.
Π‘Π΅ ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΡΠ²Π° Π΄Π΅ΠΊΠ° ΡΡΠΎΠΌ ΡΠ΅ ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ° Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ, Π΄Π²Π° (ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅) ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ (ΡΠΎΠ·Π΄Π°Π΄Π΅Π½ΠΈ ΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π°ΡΠ° Π²ΠΈΠ»ΡΡΠΊΠ°) ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ ΡΠΈΡΠ° ΠΈ ΠΏΠΈΡΡΠ²Π°ΠΌ.
Π¨ΠΊΠΎΠ»ΠΊΠ°ΡΠ° ΠΈΠΌΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠ° Π·Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ Π½Π° Π»ΠΈΠ½Π΅Π°ΡΠ½Π° Π½ΠΈΠ·Π° Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈ ΠΏΠΎΠ²ΡΠ·Π°Π½ΠΈ ΠΏΡΠ΅ΠΊΡ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄.
ΠΠΎΠ²ΠΈΡΠΈΡΠ΅ Π·Π° ΡΠΈΡΠ°ΡΠ΅ ΠΎΠ΄ ΠΏΡΠ°Π·Π΅Π½ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ (ΡΡΠΎ Π½Π΅ ΡΠΎΠ΄ΡΠΆΠΈ Π±Π°ΡΠ΅ΡΠΈΡΠ°Π½ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ) ΠΊΠΎΡ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄Π΅Π½ ΠΊΡΠ°Ρ (ΡΠΈΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ Π·Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π·Π°ΡΠ²ΠΎΡΠ΅Π½ΠΈ) Π²ΡΠ°ΡΠ°Π°Ρ βΠΊΡΠ°Ρ Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ°β. ΠΠΎΠ²ΠΈΡΠΈΡΠ΅ Π·Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π²ΠΎ ΡΠ»ΠΈΡΠ½Π° ΡΠΈΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΠ°Π°Ρ.
ΠΠ°ΡΡΠ°Π½ΠΎ
Π¨Π΅ΡΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix (1975)
ΠΠΎΡΠ½ΡΠ²Π° Π΄Π° Π³ΠΎ ΡΠΈΡΠ° ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π½Π° Unix
ΠΠ° ΠΌΠ½ΠΎΠ³Ρ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΊΠ½ΠΈΠ³Π°ΡΠ° ΠΠ°Π²ΠΎΠ²ΠΈ Π±Π΅ΡΠ΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΠΎΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Π½Π° Unix ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π΄ΠΎΡΡΠ°ΠΏΠ΅Π½ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ Bell Labs. ΠΠ°ΠΊΠΎ Π»ΠΈΡΠ΅Π½ΡΠ°ΡΠ° Π·Π° ΡΠ΅ΡΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠΌ Π΄ΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΡΠ΅ Π½Π° Π½Π°ΡΡΠ°Π²Π½ΠΈΡΠΈΡΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π½Π΅ΡΠ·ΠΈΠ½ΠΈΠΎΡ ΠΈΠ·Π²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄, Π»ΠΈΡΠ΅Π½ΡΠ°ΡΠ° Π·Π° ΡΠ΅Π΄ΠΌΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ° ΠΈΡΠΊΠ»ΡΡΠΈ ΠΎΠ²Π°Π° ΠΌΠΎΠΆΠ½ΠΎΡΡ, ΠΏΠ° ΠΊΠ½ΠΈΠ³Π°ΡΠ° Π±Π΅ΡΠ΅ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½Π° Π²ΠΎ Π½Π΅Π»Π΅Π³Π°Π»Π½ΠΈ ΠΊΠΎΠΏΠΈΠΈ Π½Π° ΠΌΠ°ΡΠΈΠ½Π°.
ΠΠ΅Π½Π΅Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΡΠΏΠΈΡΠ΅ ΠΏΡΠ΅ΠΏΠ΅ΡΠ°ΡΠ΅Π½ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΊ ΠΎΠ΄ ΠΊΠ½ΠΈΠ³Π°ΡΠ°, ΡΠΈΡΠ° ΠΊΠΎΡΠΈΡΠ° Π³ΠΈ ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π° ΡΡΡΠ΄Π΅Π½ΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΏΠΈΡ. Π Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΠΎΡΠ΅Π½ Π’ΠΎΠΌΠΈ (ΠΊΠΎΡ Π³ΠΎ Π·Π°ΠΏΠΎΡΠ½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ TUHS), ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π·Π΅ΠΌΠ΅ΡΠ΅
ΠΡΠ΅Π΄ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ 15 Π³ΠΎΠ΄ΠΈΠ½ΠΈ, Π½Π°ΠΏΠΈΡΠ°Π² ΠΊΠΎΠΏΠΈΡΠ° ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π½Π°Π²Π΅Π΄Π΅Π½ Π²ΠΎ ΠΠ°Π²ΠΎΠ²ΠΈΠ·Π°ΡΠΎΠ° ΡΡΠΎ Π½Π΅ ΠΌΠΈ ΡΠ΅ Π΄ΠΎΠΏΠ°Π΄Π½Π° ΠΊΠ²Π°Π»ΠΈΡΠ΅ΡΠΎΡ Π½Π° ΠΌΠΎΡΠ°ΡΠ° ΠΊΠΎΠΏΠΈΡΠ° ΠΎΠ΄ Π½Π΅ΠΏΠΎΠ·Π½Π°Ρ Π±ΡΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΊΠΎΠΏΠΈΠΈ. 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
).
ΠΠΎΡΠΎΠ° Π³ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π±ΡΠΎΡΠΎΡ Π½Π° ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈ Π½Π° ΠΈΠ½ΠΎΠ΄Π°. Π‘Γ¨ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π΄Π²Π°ΡΠ° ΠΊΡΠ°ΡΠ° Π½Π° ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ ΠΎΡΡΠ°Π½Π°Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈ, Π±ΡΠΎΡΠ°ΡΠΎΡ ΡΡΠ΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ 2. Π‘Π΅ Π΄ΡΠΆΠΈΠΌΠ΅ Π·Π° Π΅Π΄Π½Π° Π²ΡΡΠΊΠ° (ΠΎΠ΄ rp->f_inode
), ΠΏΠ° Π°ΠΊΠΎ Π±ΡΠΎΡΠ°ΡΠΎΡ Π΅ ΠΏΠΎΠΌΠ°Π» ΠΎΠ΄ 2, ΡΠΎΠ³Π°Ρ ΡΠΎΠ° ΡΡΠ΅Π±Π° Π΄Π° Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΡΠΈΡΠ°ΡΠ΅ Π³ΠΎ Π·Π°ΡΠ²ΠΎΡΠΈΠ» ΡΠ²ΠΎΡΠΎΡ ΠΊΡΠ°Ρ Π½Π° Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ. Π‘ΠΎ Π΄ΡΡΠ³ΠΈ Π·Π±ΠΎΡΠΎΠ²ΠΈ, ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΡΠ²Π°ΠΌΠ΅ Π΄Π° ΠΏΠΈΡΠ΅ΠΌΠ΅ Π½Π° Π·Π°ΡΠ²ΠΎΡΠ΅Π½ Π³Π°ΡΠΎΠ²ΠΎΠ΄, ΡΡΠΎ Π΅ Π³ΡΠ΅ΡΠΊΠ°. ΠΡΠ²ΠΈΠΎΡ ΠΊΠΎΠ΄ Π·Π° Π³ΡΠ΅ΡΠΊΠ° EPIPE
ΠΈ ΡΠΈΠ³Π½Π°Π» SIGPIPE
ΡΠ΅ ΠΏΠΎΡΠ°Π²ΠΈ Π²ΠΎ ΡΠ΅ΡΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix.
ΠΠΎ, Π΄ΡΡΠΈ ΠΈ Π°ΠΊΠΎ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅ΡΠΎΡ Π΅ ΠΎΡΠ²ΠΎΡΠ΅Π½, ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ»Π½. ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΡΠ° ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡΠ²Π°ΠΌΠ΅ Π±ΡΠ°Π²Π°ΡΠ° ΠΈ ΠΎΠ΄ΠΈΠΌΠ΅ Π΄Π° ΡΠΏΠΈΠ΅ΠΌΠ΅ ΡΠΎ Π½Π°Π΄Π΅ΠΆ Π΄Π΅ΠΊΠ° Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ° ΠΎΠ΄ Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ ΠΈ ΡΠ΅ ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΠΈ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΠΏΡΠΎΡΡΠΎΡ Π²ΠΎ Π½Π΅Π³ΠΎ. ΠΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΡΠ°Π·Π±ΡΠ΄ΠΈΠΌΠ΅, ΡΠ΅ Π²ΡΠ°ΡΠ°ΠΌΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ, ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΡΠ° Π·Π°ΠΊΠ°ΡΡΠ²Π°ΠΌΠ΅ Π±ΡΠ°Π²Π°ΡΠ° ΠΈ Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π°ΠΌΠ΅ Π½ΠΎΠ² ΡΠΈΠΊΠ»ΡΡ Π½Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅.
ΠΠΊΠΎ ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΡΠ»ΠΎΠ±ΠΎΠ΄Π΅Π½ ΠΏΡΠΎΡΡΠΎΡ Π²ΠΎ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ, ΡΠΎΠ³Π°Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° Π½Π΅Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ i_size1
inode'a (ΡΠΎ ΠΏΡΠ°Π·Π΅Π½ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ Π΅Π΄Π½Π°ΠΊΠΎΠ² Π½Π° 0) ΡΠΊΠ°ΠΆΡΠ²Π° Π½Π° ΠΊΡΠ°ΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΡΡΠΎ Π²Π΅ΡΠ΅ Π³ΠΈ ΡΠΎΠ΄ΡΠΆΠΈ. ΠΠΊΠΎ ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΠΏΡΠΎΡΡΠΎΡ Π·Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΏΠΎΠΏΠΎΠ»Π½ΠΈΠΌΠ΅ Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ ΠΎΠ΄ i_size1
Π΄Π° PIPESIZ
. ΠΠΎΡΠΎΠ° ΡΠ° ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡΠ²Π°ΠΌΠ΅ Π±ΡΠ°Π²Π°ΡΠ° ΠΈ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΡΠ²Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΠ°Π·Π±ΡΠ΄ΠΈΠΌΠ΅ ΡΠ΅ΠΊΠΎΡ ΠΏΡΠΎΡΠ΅Ρ ΡΡΠΎ ΡΠ΅ΠΊΠ° Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ° ΠΎΠ΄ Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ. Π‘Π΅ Π²ΡΠ°ΡΠ°ΠΌΠ΅ Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π΄Π°Π»ΠΈ ΡΡΠΏΠ΅Π°Π²ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌΠ΅ ΠΎΠ½ΠΎΠ»ΠΊΡ Π±Π°ΡΡΠΈ ΠΊΠΎΠ»ΠΊΡ ΡΡΠΎ Π½ΠΈ ΡΡΠ΅Π±Π°Π°. ΠΠΊΠΎ Π½Π΅, ΡΠΎΠ³Π°Ρ Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π°ΠΌΠ΅ Π½ΠΎΠ² ΡΠΈΠΊΠ»ΡΡ Π½Π° ΡΠ½ΠΈΠΌΠ°ΡΠ΅.
ΠΠ±ΠΈΡΠ½ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°Ρ i_mode
inode ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ r
, w
ΠΈ x
. ΠΠΎ, Π²ΠΎ ΡΠ»ΡΡΠ°Ρ Π½Π° ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π½Π΅ΠΊΠΎΡ ΠΏΡΠΎΡΠ΅Ρ ΡΠ΅ΠΊΠ° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΈΠ»ΠΈ ΡΠΈΡΠ°ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π±ΠΈΡΠΎΠ²ΠΈ IREAD
ΠΈ IWRITE
ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎ. ΠΡΠΎΡΠ΅ΡΠΎΡ Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π° Π·Π½Π°ΠΌΠ΅ΡΠΎ ΠΈ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π° sleep()
, Π° ΡΠ΅ ΠΎΡΠ΅ΠΊΡΠ²Π° Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π° Π΄Π° ΠΏΠΎΠ²ΠΈΠΊΠ° Π½Π΅ΠΊΠΎΡ Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ wakeup()
.
ΠΠΈΡΡΠΈΠ½ΡΠΊΠ°ΡΠ° ΠΌΠ°Π³ΠΈΡΠ° ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° Π²ΠΎ sleep()
ΠΈ wakeup()
. Π’ΠΈΠ΅ ΡΠ΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ΠΈ Π²ΠΎ
/*
* Give up the processor till a wakeup occurs
* on chan, at which time the process
* enters the scheduling queue at priority pri.
* The most important effect of pri is that when
* pri<0 a signal cannot disturb the sleep;
* if pri>=0 signals will be processed.
* Callers of this routine must be prepared for
* premature return, and check that the reason for
* sleeping has gone away.
*/
sleep(chan, pri) /* β¦ */
/*
* Wake up all processes sleeping on chan.
*/
wakeup(chan) /* β¦ */
ΠΡΠΎΡΠ΅ΡΠΎΡ ΠΊΠΎΡ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π° sleep()
Π·Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΊΠ°Π½Π°Π», ΠΏΠΎΠ΄ΠΎΡΠ½Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±ΡΠ΄ΠΈ ΠΎΠ΄ Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ, ΠΊΠΎΡ ΡΠ΅ ΡΠ΅ ΡΠ°Π²ΠΈ wakeup()
Π·Π° ΠΈΡΡΠΈΠΎΡ ΠΊΠ°Π½Π°Π». writep()
ΠΈ readp()
Π³ΠΈ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½ΠΈΡΠ°Π°Ρ ΡΠ²ΠΎΠΈΡΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΏΡΠ΅ΠΊΡ ΡΠ°ΠΊΠ²ΠΈ ΡΠΏΠ°ΡΠ΅Π½ΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ. ΠΠ°Π±Π΅Π»Π΅ΠΆΠΈ Π³ΠΎ ΡΠΎΠ° pipe.c
ΡΠ΅ΠΊΠΎΠ³Π°Ρ Π΄Π°Π²Π°ΡΡΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ PPIPE
ΠΊΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ°Π°Ρ sleep()
, ΠΏΠ° ΡΠΈΡΠ΅ sleep()
ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΊΠΈΠ½Π΅ ΡΠΎ ΡΠΈΠ³Π½Π°Π».
Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ ΡΓ¨ Π·Π° Π΄Π° ΡΠ° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° readp()
:
readp(fp)
int *fp;
{
register *rp, *ip;
rp = fp;
ip = rp->f_inode;
loop:
/* Very conservative locking. */
plock(ip);
/*
* If the head (read) has caught up with
* the tail (write), reset both to 0.
*/
if(rp->f_offset[1] == ip->i_size1) {
if(rp->f_offset[1] != 0) {
rp->f_offset[1] = 0;
ip->i_size1 = 0;
if(ip->i_mode&IWRITE) {
ip->i_mode =& ~IWRITE;
wakeup(ip+1);
}
}
/*
* If there are not both reader and
* writer active, return without
* satisfying read.
*/
prele(ip);
if(ip->i_count < 2)
return;
ip->i_mode =| IREAD;
sleep(ip+2, PPIPE);
goto loop;
}
/* Read and return */
u.u_offset[0] = 0;
u.u_offset[1] = rp->f_offset[1];
readi(ip);
rp->f_offset[1] = u.u_offset[1];
prele(ip);
}
ΠΠΎΠΆΠ΅Π±ΠΈ ΡΠ΅ Π²ΠΈ Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ° ΡΠΈΡΠ°ΡΠ΅ ΠΎΠ²Π°Π° ΡΡΠ½ΠΊΡΠΈΡΠ° ΠΎΠ΄ Π΄Π½ΠΎΡΠΎ ΠΊΠΎΠ½ Π²ΡΠ²ΠΎΡ. ΠΡΠ°Π½ΠΊΠ°ΡΠ° βΡΠΈΡΠ°Ρ ΠΈ Π²ΡΠ°ΡΠΈβ ΠΎΠ±ΠΈΡΠ½ΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠΎΠ³Π° ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ Π½Π°ΡΡΠΎΠ²ΠΎΠ΄ΠΎΡ. ΠΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ, Π½ΠΈΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ f_offset
ΠΏΡΠΎΡΠΈΡΠ°ΡΡΠ΅, Π° ΠΏΠΎΡΠΎΠ° Π°ΠΆΡΡΠΈΡΠ°ΡΡΠ΅ ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ° Π½Π° ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎΡΠΎ ΠΏΠΎΠΌΠ΅ΡΡΡΠ²Π°ΡΠ΅.
ΠΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΈ ΠΎΡΡΠΈΡΡΠ²Π°ΡΠ°, ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΡΠ°Π·Π΅Π½ Π°ΠΊΠΎ Π΅ Π΄ΠΎΡΡΠΈΠ³Π½Π°ΡΠΎ ΠΏΠΎΠΌΠ΅ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π·Π° ΡΠΈΡΠ°ΡΠ΅ i_size1
Π½Π° ΠΈΠ½ΠΎΠ΄Π°ΡΠ°. ΠΠ° ΡΠ΅ΡΠ΅ΡΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΡΠ°ΡΠ° Π½Π° 0 ΠΈ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΡΠ²Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΠ°Π·Π±ΡΠ΄ΠΈΠΌΠ΅ ΡΠ΅ΠΊΠΎΡ ΠΏΡΠΎΡΠ΅Ρ ΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° Π·Π°ΠΏΠΈΡΠ΅ Π½Π° Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ. ΠΠ½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΊΠΎΠ³Π° ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ΅ΡΠΎΡ Π΅ ΠΏΠΎΠ»Π½, writep()
Π·Π°ΡΠΏΠΈΠ²Π° Π½Π° ip+1
. Π ΡΠ΅Π³Π° ΠΊΠΎΠ³Π° Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ Π΅ ΠΏΡΠ°Π·Π΅Π½, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΠ°Π·Π±ΡΠ΄ΠΈΠΌΠ΅ Π·Π° Π΄Π° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈ ΡΠΎ ΡΠΈΠΊΠ»ΡΡΠΎΡ Π½Π° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΠ΅.
ΠΠΊΠΎ Π½Π΅ΠΌΠ° ΡΡΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠΈΡΠ°, ΡΠΎΠ³Π°Ρ readp()
ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈ Π·Π½Π°ΠΌΠ΅ IREAD
ΠΈ Π·Π°ΡΠΏΠΈΠ΅ Π½Π° ip+2
. ΠΠ½Π°Π΅ΠΌΠ΅ ΡΡΠΎ ΡΠ΅ Π³ΠΎ ΡΠ°Π·Π±ΡΠ΄ΠΈ writep()
ΠΊΠΎΠ³Π° ΡΠ΅ Π·Π°ΠΏΠΈΡΠ΅ Π½Π΅ΠΊΠΎΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ.
ΠΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ Π½Π° u
Β» ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΡΡΠ΅ΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΠΎΠ±ΠΈΡΠ½ΠΈ I/O ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠΎΠΈ Π·Π΅ΠΌΠ°Π°Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°, ΠΏΠΎΠ·ΠΈΡΠΈΡΠ°, Π±Π°ΡΠ΅Ρ Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ° ΠΈ Π³ΠΎ Π±ΡΠΎΡΠ°Ρ Π±ΡΠΎΡΠΎΡ Π½Π° Π±Π°ΡΡΠΈ Π·Π° ΡΠΈΡΠ°ΡΠ΅ ΠΈΠ»ΠΈ ΠΏΠΈΡΡΠ²Π°ΡΠ΅.
/*
* Read the file corresponding to
* the inode pointed at by the argument.
* The actual read arguments are found
* in the variables:
* u_base core address for destination
* u_offset byte offset in file
* u_count number of bytes to read
* u_segflg read to kernel/user
*/
readi(aip)
struct inode *aip;
/* β¦ */
/*
* Write the file corresponding to
* the inode pointed at by the argument.
* The actual write arguments are found
* in the variables:
* u_base core address for source
* u_offset byte offset in file
* u_count number of bytes to write
* u_segflg write to kernel/user
*/
writei(aip)
struct inode *aip;
/* β¦ */
Π¨ΡΠΎ ΡΠ΅ ΠΎΠ΄Π½Π΅ΡΡΠ²Π° Π΄ΠΎ βΠΊΠΎΠ½Π·Π΅ΡΠ²Π°ΡΠΈΠ²Π½ΠΎβ Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠ΅, ΡΠΎΠ³Π°Ρ readp()
ΠΈ writep()
Π·Π°ΠΊΠ»ΡΡΠ΅ΡΠ΅ Π³ΠΈ ΠΈΠ½ΠΎΠ΄ΠΈΡΠ΅ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ Π·Π°Π²ΡΡΠ°Ρ ΠΈΠ»ΠΈ Π½Π΅ Π΄ΠΎΠ±ΠΈΡΠ°Ρ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ (Ρ.Π΅. ΠΏΠΎΠ²ΠΈΠΊΠ°ΡΡΠ΅ wakeup
). plock()
ΠΈ prele()
Π Π°Π±ΠΎΡΠ΅ΡΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ: ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΡΠ΅Ρ Π½Π° ΠΏΠΎΠ²ΠΈΡΠΈ sleep
ΠΈ wakeup
Π΄ΠΎΠ·Π²ΠΎΠ»Π΅ΡΠ΅ Π½ΠΈ Π΄Π° Π³ΠΎ ΡΠ°Π·Π±ΡΠ΄ΠΈΠΌΠ΅ ΡΠ΅ΠΊΠΎΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΊΠΎΡ ΠΌΡ ΡΡΠ΅Π±Π° Π±ΡΠ°Π²Π°ΡΠ° ΡΡΠΎ ΡΡΠΎΡΡΠΊΡ ΡΠ° ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΠΈΠ²ΠΌΠ΅:
/*
* Lock a pipe.
* If its already locked, set the WANT bit and sleep.
*/
plock(ip)
int *ip;
{
register *rp;
rp = ip;
while(rp->i_flag&ILOCK) {
rp->i_flag =| IWANT;
sleep(rp, PPIPE);
}
rp->i_flag =| ILOCK;
}
/*
* Unlock a pipe.
* If WANT bit is on, wakeup.
* This routine is also used to unlock inodes in general.
*/
prele(ip)
int *ip;
{
register *rp;
rp = ip;
rp->i_flag =& ~ILOCK;
if(rp->i_flag&IWANT) {
rp->i_flag =& ~IWANT;
wakeup(rp);
}
}
ΠΡΠΏΡΠ²ΠΈΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Π² Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°ΠΌ Π·ΠΎΡΡΠΎ readp()
Π½Π΅ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΡΠ²Π° prele(ip)
ΠΏΡΠ΅Π΄ ΠΏΠΎΠ²ΠΈΠΊΠΎΡ wakeup(ip+1)
. ΠΡΠ²Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ° writep()
ΠΏΠΎΠ²ΠΈΡΠΈ Π²ΠΎ ΡΠ²ΠΎΡΠ°ΡΠ° ΡΠ°ΠΌΠΊΠ°, ΠΎΠ²Π° plock(ip)
, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΠΈΡΠ° ΡΠΎ ΡΠΎΡ-ΡΠΎΠΊΠ°ΠΊ Π°ΠΊΠΎ readp()
ΡΓ¨ ΡΡΡΠ΅ Π½Π΅ Π³ΠΎ ΠΎΡΡΡΡΠ°Π½ΠΈΠ» ΡΠ²ΠΎΡΠΎΡ Π±Π»ΠΎΠΊ, ΠΏΠ° ΠΊΠΎΠ΄ΠΎΡ Π½Π΅ΠΊΠ°ΠΊΠΎ ΠΌΠΎΡΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ. ΠΠΊΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ Π²ΠΎ wakeup()
, ΡΡΠ°Π½ΡΠ²Π° ΡΠ°ΡΠ½ΠΎ Π΄Π΅ΠΊΠ° ΡΠ°ΠΌΠΎ Π³ΠΎ ΠΎΠ·Π½Π°ΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΡΠΏΠΈΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ Π·Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅, ΡΠ°ΠΊΠ° ΡΡΠΎ Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π° sched()
Π½Π°Π²ΠΈΡΡΠΈΠ½Π° Π³ΠΎ Π»Π°Π½ΡΠΈΡΠ°ΡΠ΅. ΠΠ½Π°ΡΠΈ readp()
ΠΏΡΠΈΡΠΈΠ½ΠΈ wakeup()
, ΠΎΡΠΊΠ»ΡΡΡΠ²Π°, ΠΏΠΎΡΡΠ°Π²ΡΠ²Π° IREAD
ΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ sleep(ip+2)
- ΡΠ΅ΡΠΎ ΠΎΠ²Π° ΠΏΡΠ΅ΡΡ
ΠΎΠ΄Π½ΠΎ writep()
Π³ΠΎ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ° ΡΠΈΠΊΠ»ΡΡΠΎΡ.
ΠΠ²Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠ»Π΅ΡΠΈΡΠ° ΠΎΠΏΠΈΡΠΎΡ Π½Π° ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ Π²ΠΎ ΡΠ΅ΡΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. ΠΠ΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΊΠΎΠ΄, Π΄Π°Π»Π΅ΠΊΡΡΠ΅ΠΆΠ½ΠΈ ΠΈΠΌΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ.
Xv6, Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ°Π΄ΡΠΎ ΡΠ»ΠΈΡΠ½ΠΎ Π½Π° Unix
ΠΠ° ΡΠ΅ ββΡΠΎΠ·Π΄Π°Π΄Π΅ ΡΠ°Π΄ΡΠΎ
ΠΠΎΠ΄ΠΎΡ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠ°ΡΠ½Π° ΠΈ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° pipealloc()
:
#define PIPESIZE 512
struct pipe {
struct spinlock lock;
char data[PIPESIZE];
uint nread; // number of bytes read
uint nwrite; // number of bytes written
int readopen; // read fd is still open
int writeopen; // write fd is still open
};
int
pipealloc(struct file **f0, struct file **f1)
{
struct pipe *p;
p = 0;
*f0 = *f1 = 0;
if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0)
goto bad;
if((p = (struct pipe*)kalloc()) == 0)
goto bad;
p->readopen = 1;
p->writeopen = 1;
p->nwrite = 0;
p->nread = 0;
initlock(&p->lock, "pipe");
(*f0)->type = FD_PIPE;
(*f0)->readable = 1;
(*f0)->writable = 0;
(*f0)->pipe = p;
(*f1)->type = FD_PIPE;
(*f1)->readable = 0;
(*f1)->writable = 1;
(*f1)->pipe = p;
return 0;
bad:
if(p)
kfree((char*)p);
if(*f0)
fileclose(*f0);
if(*f1)
fileclose(*f1);
return -1;
}
pipealloc()
ΡΠ° ΠΏΠΎΡΡΠ°Π²ΡΠ²Π° ΡΠΎΡΡΠΎΡΠ±Π°ΡΠ° Π½Π° ΠΎΡΡΠ°ΡΠΎΠΊΠΎΡ ΠΎΠ΄ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ°, ΠΊΠΎΡΠ° Π²ΠΊΠ»ΡΡΡΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ piperead()
, pipewrite()
ΠΈ pipeclose()
. ΠΠΈΡΡΠΈΠ½ΡΠΊΠΈΠΎΡ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈ ΠΏΠΎΠ²ΠΈΠΊ sys_pipe
Π΅ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π° Π²ΠΎ
Linux 0.01
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΡΠ΄Π΅ΡΠ΅ ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π·Π° Linux 0.01. ΠΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΠΎΡΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΡΡΠ²Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ Π²ΠΎ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° fs
/pipe.c
. ΠΠ²Π΄Π΅, ΠΈΠ½ΠΎΠ΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΠΏΡΠ΅ΡΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ Π½Π° Π³Π°ΡΠΎΠ²ΠΎΠ΄ΠΎΡ, Π½ΠΎ ΡΠ°ΠΌΠΈΠΎΡ Π³Π°ΡΠΎΠ²ΠΎΠ΄ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π²ΠΎ ΠΌΠΎΠ΄Π΅ΡΠ½Π° C. ΠΠΊΠΎ ΡΡΠ΅ Π³ΠΎ ΠΏΡΠΎΠ±ΠΈΠ»Π΅ ΠΊΠΎΠ΄ΠΎΡ Π½Π° ΡΠ΅ΡΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅, Π½Π΅ΠΌΠ° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΠΎΠ²Π΄Π΅. ΠΠ°ΠΊΠ° ΠΈΠ·Π³Π»Π΅Π΄Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° write_pipe()
:
int write_pipe(struct m_inode * inode, char * buf, int count)
{
char * b=buf;
wake_up(&inode->i_wait);
if (inode->i_count != 2) { /* no readers */
current->signal |= (1<<(SIGPIPE-1));
return -1;
}
while (count-->0) {
while (PIPE_FULL(*inode)) {
wake_up(&inode->i_wait);
if (inode->i_count != 2) {
current->signal |= (1<<(SIGPIPE-1));
return b-buf;
}
sleep_on(&inode->i_wait);
}
((char *)inode->i_size)[PIPE_HEAD(*inode)] =
get_fs_byte(b++);
INC_PIPE( PIPE_HEAD(*inode) );
wake_up(&inode->i_wait);
}
wake_up(&inode->i_wait);
return b-buf;
}
ΠΡΡΠΈ ΠΈ Π±Π΅Π· Π΄Π° Π³ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΠΈΡΠ΅ Π½Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΠΈΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π±ΡΠΎΡΠΎΡ Π½Π° ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈ Π½Π° ΠΈΠ½ΠΎΠ΄Π°ΡΠ° Π·Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ Π΄Π°Π»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠ°ΡΠ° Π·Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠΈΡΠ° ΡΠΎ SIGPIPE
. ΠΠΎΠΊΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π±Π°ΡΡ-ΠΏΠΎ-Π±Π°ΡΡ, ΠΎΠ²Π°Π° ΡΡΠ½ΠΊΡΠΈΡΠ° Π΅ Π»Π΅ΡΠ½Π° Π·Π° ΡΠΏΠΎΡΠ΅Π΄Π±Π° ΡΠΎ Π³ΠΎΡΠ΅Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΡΠ΅ ΠΈΠ΄Π΅ΠΈ. ΠΡΡΠΈ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° sleep_on
/wake_up
Π½Π΅ ΠΈΠ·Π³Π»Π΅Π΄Π° ΡΠΎΠ»ΠΊΡ ΡΡΡΠΎ.
ΠΠΎΠ΄Π΅ΡΠ½ΠΈ Linux ΠΊΠ΅ΡΠ½Π΅Π»ΠΈ, FreeBSD, NetBSD, OpenBSD
ΠΠ°Π±ΡΠ·ΠΈΠ½Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π² Π½Π° Π½Π΅ΠΊΠΎΠΈ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈ ΠΊΠ΅ΡΠ½Π΅Π»ΠΈ. ΠΠΈΡΡ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½ΠΈΠ² Π²Π΅ΡΠ΅ Π½Π΅ΠΌΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ° Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° Π΄ΠΈΡΠΊ (Π½Π΅ Π΅ ΠΈΠ·Π½Π΅Π½Π°Π΄ΡΠ²Π°ΡΠΊΠΈ). ΠΠΈΠ½ΡΠΊΡ ΠΈΠΌΠ° ΡΠ²ΠΎΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°. Π ΠΈΠ°ΠΊΠΎ ΡΡΠΈΡΠ΅ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈ BSD ΠΊΠ΅ΡΠ½Π΅Π»ΠΈ ΡΠΎΠ΄ΡΠΆΠ°Ρ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° ΠΊΠΎΠ΄ ΡΡΠΎ Π³ΠΎ Π½Π°ΠΏΠΈΡΠ° ΠΠΎΠ½ ΠΠ°ΡΡΠΎΠ½, ΡΠΎ ΡΠ΅ΠΊΠΎΡ Π½Π° Π³ΠΎΠ΄ΠΈΠ½ΠΈΡΠ΅ ΡΠΈΠ΅ ΡΡΠ°Π½Π°Π° ΠΏΡΠ΅ΠΌΠ½ΠΎΠ³Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΅Π΄Π½ΠΈ ΠΎΠ΄ Π΄ΡΡΠ³ΠΈ.
ΠΠ° ΡΠΈΡΠ° fs
/pipe.c
(Π½Π° ΠΠΈΠ½ΡΠΊΡ) ΠΈΠ»ΠΈ sys
/kern
/sys_pipe.c
(Π½Π° *BSD), ΠΏΠΎΡΡΠ΅Π±Π½Π° Π΅ Π²ΠΈΡΡΠΈΠ½ΡΠΊΠ° ΠΏΠΎΡΠ²Π΅ΡΠ΅Π½ΠΎΡΡ. ΠΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅ ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ°ΡΠ° Π·Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ Π²Π΅ΠΊΡΠΎΡΡΠΊΠΈ ΠΈ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈ I/O ΡΠ΅ Π²Π°ΠΆΠ½ΠΈ Π²ΠΎ ΠΊΠΎΠ΄ΠΎΡ Π΄Π΅Π½Π΅Ρ. Π Π΄Π΅ΡΠ°Π»ΠΈΡΠ΅ Π·Π° ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π±Π°ΡΠ° Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ°, Π±ΡΠ°Π²ΠΈΡΠ΅ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ. ΠΠ²Π° Π½Π΅ Π΅ ΠΎΠ½Π° ΡΡΠΎ ΠΈΠΌ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π½Π° ΡΠ½ΠΈΠ²Π΅ΡΠ·ΠΈΡΠ΅ΡΠΈΡΠ΅ Π·Π° Π²ΠΎΠ²Π΅Π΄Π΅Π½ ΠΊΡΡΡ Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ.
ΠΠΎ ΡΠ΅ΠΊΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΌΠΈ Π±Π΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΄Π° ΠΎΡΠΊΠΎΠΏΠ°ΠΌ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΡΠ°ΡΠΈ ΠΎΠ±ΡΠ°ΡΡΠΈ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ SIGPIPE
ΠΈ ΡΠ΅ Π²ΡΠ°ΡΠΈ EPIPE
ΠΊΠΎΠ³Π° ΡΠ΅ ΠΏΠΈΡΡΠ²Π° Π½Π° Π·Π°ΡΠ²ΠΎΡΠ΅Π½ ΡΠ΅Π²ΠΊΠΎΠ²ΠΎΠ΄) Π²ΠΎ ΡΠΈΡΠ΅ ΠΎΠ²ΠΈΠ΅, ΡΠΎΠ»ΠΊΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ, ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈ ΠΊΠ΅ΡΠ½Π΅Π»ΠΈ. ΠΠ΅ΡΠΎΡΠ°ΡΠ½ΠΎ Π½ΠΈΠΊΠΎΠ³Π°Ρ Π½Π΅ΠΌΠ° Π΄Π° Π²ΠΈΠ΄Π°ΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ PDP-11 Π²ΠΎ ΠΆΠΈΠ²ΠΎ, Π½ΠΎ ΠΈΠΌΠ° ΡΡΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ Π΄Π° Π½Π°ΡΡΠ°ΠΌ ΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΡ ΡΡΠΎ Π±Π΅ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΏΡΠ΅Π΄ Π΄Π° ΡΠ΅ ΡΠΎΠ΄Π°ΠΌ.
ΠΠ°ΠΏΠΈΡΠ°Π½ΠΎ ΠΎΠ΄ ΠΠΈΠ²ΠΈ ΠΠ°ΠΏΡΡ Π²ΠΎ 2011 Π³ΠΎΠ΄ΠΈΠ½Π°, Π½Π°ΠΏΠΈΡΠΎΡ β
ΠΠ·Π²ΠΎΡ: www.habr.com