
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Π΅ ΠΎΠΏΠΈΡΠ°Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΈΡΠ΅ Π² ΡΠ΄ΡΠΎΡΠΎ Π½Π° 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) ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π°ΡΠΎΠΌΠ°ΡΠ΅Π½, Π·Π° Π΄Π° ΠΌΠΎΠ³Π°Ρ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π΄Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°Ρ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ ΡΡΠ΅Π· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΏΠΎ Π½Π°ΡΠΈΠ½, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ (ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΡ ΡΠ°ΠΊΠΈΠ²Π° Π³Π°ΡΠ°Π½ΡΠΈΠΈ) Π½Π΅ ΠΌΠΎΠ³Π°Ρ.
ΠΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΡΠ°ΠΉΠ» ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°ΠΏΠΈΡΠ΅ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠΈ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° Π³ΠΈ ΠΏΡΠ΅Π΄Π°Π΄Π΅ Π½Π° Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ. ΠΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π΄Π΅ΠΉΡΡΠ²Π°Ρ Π² ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΡΡΠΎΠ³Π° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎΡΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π²ΡΠ½ΡΠ΅Π½ ΡΠΈΠ³Π½Π°Π»Π΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ (ΠΊΠ°ΡΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡ), Π·Π° Π΄Π° ΡΠ²Π΅Π΄ΠΎΠΌΡΡ Π΅Π΄ΠΈΠ½ Π΄ΡΡΠ³ Π·Π° ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π½Π΅ΡΠΎ. ΠΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΈΡΠ΅ Π½ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Ρ ΠΎΡ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠ΅Π·ΠΈ Π·Π°ΡΡΡΠ΄Π½Π΅Π½ΠΈΡ.
ΠΠ°ΠΊΠ²ΠΎ ΡΡΡΡΠΈΠΌ?
Π©Π΅ ΠΎΠ±ΡΡΠ½Ρ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠΈ, Π·Π° Π΄Π° Π²ΠΈ Π΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΡΡ. Π©Π΅ Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π±ΡΡΠ΅Ρ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ Π½ΡΠΊΠ°ΠΊΠ²ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅. Π©Π΅ ΡΠ° Π½ΡΠΆΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ Π±ΡΡΠ΅ΡΠ°. ΠΡΠΆΠ΅Π½ Π΅ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΊΠΎΠΉΡΠΎ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ Π·Π°ΠΏΠΈΡ Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ. Π ΡΠ΅ ΡΠ° Π½ΡΠΆΠ½ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π·Π° Π΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΎΡΠΎ Π³ΠΎΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.
Π‘Π΅Π³Π° ΡΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π΄Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°ΠΌΠ΅ ΠΏΡΠΈ ΡΡΠΊΠ° ΡΠ²Π΅ΡΠ»ΠΈΠ½Π° Π»Π°ΠΌΠΏΠΈΡΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ΄ΡΠΎΡΠΎ, Π·Π° Π΄Π° ΠΏΠΎΡΠ²ΡΡΠ΄ΠΈΠΌ ΠΈΠ»ΠΈ ΠΎΠΏΡΠΎΠ²Π΅ΡΠ³Π°Π΅ΠΌ Π½Π°ΡΠ°ΡΠ° Π½Π΅ΡΡΠ½Π° ΡΠΌΡΡΠ²Π΅Π½Π° ΠΌΠΎΠ΄Π΅Π». ΠΠΎ Π²ΠΈΠ½Π°Π³ΠΈ Π±ΡΠ΄Π΅ΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΈ Π·Π° ΠΈΠ·Π½Π΅Π½Π°Π΄ΠΈ.
ΠΡΠ΄Π΅ ΡΡΡΡΠΈΠΌ?
ΠΠ΅ Π·Π½Π°ΠΌ ΠΊΡΠ΄Π΅ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° ΠΌΠΎΡΡ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΠΈΠ·Π²Π΅ΡΡΠ½Π°ΡΠ° ΠΊΠ½ΠΈΠ³Π° "" Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° Unix 6, Π½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΡΡΡΡΠΈΠΌ ΠΎΠ½Π»Π°ΠΉΠ½ Π² Π½Π° ΠΎΡΠ΅ ΠΏΠΎ-ΡΡΠ°ΡΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° Unix.
ΠΠ»ΡΠΆΠ΄Π°Π΅Π½Π΅ΡΠΎ ΠΈΠ· Π°ΡΡ ΠΈΠ²ΠΈΡΠ΅ Π½Π° TUHS Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΡΠ·Π΅ΠΉ. ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ Π² Π½Π°ΡΠ°ΡΠ° ΠΎΠ±ΡΠ° ΠΈΡΡΠΎΡΠΈΡ ΠΈ ΡΡΠ²ΡΡΠ²Π°ΠΌ ΡΠ΅ΡΠΏΠ΅ΠΊΡ ΠΊΡΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎΠ΄ΠΈΡΠ½ΠΈΡΠ΅ ΡΡΠΈΠ»ΠΈΡ Π·Π° Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈ Π±ΠΈΡ ΠΏΠΎ Π±ΠΈΡ ΠΎΡ ΡΡΠ°ΡΠΈ ΠΊΠ°ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΏΠ΅ΡΠ°ΡΠΈ. Π ΠΎΡΡΡΠ° ΠΎΡΡΠ·Π½Π°Π²Π°ΠΌ Π»ΠΈΠΏΡΠ²Π°ΡΠΈΡΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈ.
Π£Π΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ²Π°ΠΉΠΊΠΈ Π»ΡΠ±ΠΎΠΏΠΈΡΡΡΠ²ΠΎΡΠΎ ΡΠΈ ΠΎΡΠ½ΠΎΡΠ½ΠΎ Π΄ΡΠ΅Π²Π½Π°ΡΠ° ΠΈΡΡΠΎΡΠΈΡ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΈΡΠ΅, ΠΌΠΎΠΆΠ΅ΠΌ Π·Π° ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ Π½Π° ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡΠ΅ ΡΠ΄ΡΠ°.
ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, pipe Π΅ ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ ΠΏΠΎΠ²ΠΈΠΊ Π½ΠΎΠΌΠ΅Ρ 42 Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° sysent[]. Π‘Π»ΡΡΠ°ΠΉΠ½ΠΎΡΡ?
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΈ ΡΠ΄ΡΠ° Π½Π° Unix (1970β1974)
ΠΠ΅ Π½Π°ΠΌΠ΅ΡΠΈΡ
Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΡΠ»Π΅Π΄ΠΈ pipe(2) Π½ΠΈΡΠΎ Π² (ΡΠ½ΡΠ°ΡΠΈ 1970 Π³.), Π½ΠΈΡΠΎ Π² (Π½ΠΎΠ΅ΠΌΠ²ΡΠΈ 1971 Π³.), Π½ΠΈΡΠΎ Π² Π½Π΅ΠΏΡΠ»Π½ΠΈΡ ΠΈΠ·Ρ
ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π½Π° (ΡΠ½ΠΈ 1972 Π³.).
TUHS ΡΠ²ΡΡΠ΄ΠΈ, ΡΠ΅ (ΡΠ΅Π²ΡΡΠ°ΡΠΈ 1973) Π±Π΅ΡΠ΅ ΠΏΡΡΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Ρ ΠΊΠ°Π½Π°Π»ΠΈ:
Π’ΡΠ΅ΡΠ°ΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΈΡ Π½Π° Unix Π±Π΅ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Ρ ΡΠ΄ΡΠΎ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° Π°ΡΠ΅ΠΌΠ±Π»Π΅Ρ, Π½ΠΎ ΠΈ ΠΏΡΡΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Ρ ΠΊΠ°Π½Π°Π»ΠΈ. ΠΡΠ΅Π· 1973 Π³ΠΎΠ΄ΠΈΠ½Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅ΡΠ΅ ΠΏΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ΅ΡΠ°ΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΈΡ, ΡΠ΄ΡΠΎ Π±Π΅ΡΠ΅ ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° C, ΠΈ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ΡΠ΅ΡΠ²ΡΡΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° Unix.
ΠΠ΄ΠΈΠ½ ΠΎΡ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ ΡΠΊΠ°Π½ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ, Π² ΠΊΠΎΠΉΡΠΎ ΠΠ°Π³ ΠΠ°ΠΊΠΠ»ΡΠΎΠΉ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈ ΠΈΠ΄Π΅ΡΡΠ° Π·Π° "ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° Π½Π° Π³ΡΠ°Π΄ΠΈΠ½ΡΠΊΠΈΡ ΠΌΠ°ΡΠΊΡΡ".

Π ΠΊΠ½ΠΈΠ³Π°ΡΠ° Π½Π° ΠΡΠ°ΠΉΡΠ½ ΠΠ΅ΡΠ½ΠΈΠ³Π°Π½ "" ΡΡΡΠΎ ΡΠ΅ ΡΠΏΠΎΠΌΠ΅Π½Π°Π²Π° ΡΠΎΠ·ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ: "... ΡΠΎΠΉ Π²ΠΈΡΠ΅ΡΠ΅ Π½Π° ΡΡΠ΅Π½Π°ΡΠ° Π² ΠΎΡΠΈΡΠ° ΠΌΠΈ Π² Bell Labs Π² ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° 30 Π³ΠΎΠ΄ΠΈΠ½ΠΈ". ΠΡΠΎ , ΠΈ ΠΎΡΠ΅ Π΅Π΄Π½Π° ΠΈΡΡΠΎΡΠΈΡ ΠΎΡ :
ΠΠΎΠ³Π°ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Unix, ΠΌΠΎΡΡ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ ΠΊΡΠΌ ΠΊΠΎΡΡΡΠΈΠ½ΠΈΡΠ΅ ΠΌΠ΅ Π½Π°ΠΊΠ°ΡΠ° Π΄Π° ΠΏΠΎΠΏΠΈΡΠ°ΠΌ Π°Π²ΡΠΎΡΠ° Π½Π° ΠΠ‘, ΠΠ΅Π½ Π’ΠΎΠΌΠΏΡΡΠ½, Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅, Π·Π°ΠΏΠΈΡΠ°Π½ΠΈ Π² Π½ΡΠΊΠ°ΠΊΡΠ² ΠΏΡΠΎΡΠ΅Ρ, Π΄Π° ΠΎΡΠΈΠ²Π°Ρ Π½Π΅ ΡΠ°ΠΌΠΎ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ, Π½ΠΎ ΠΈ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π° ΠΊΡΠΌ Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ. ΠΠ΅Π½ ΡΠ΅ΡΠΈ, ΡΠ΅ ΡΠΎΠ²Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΊΠ°ΡΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡ, ΡΠΎΠΉ ΠΈΡΠΊΠ°ΡΠ΅ Π²ΡΡΠΊΠ° ΡΠΈΡΡΠ΅ΠΌΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ Π΄Π° ΠΈΠ³ΡΠ°Π΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½Π° ΡΠΎΠ»Ρ. ΠΠ°ΠΈΡΡΠΈΠ½Π° Π»ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎΡΠΎ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π΅ Ρ Π³ΠΎΠ»ΡΠΌΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π² ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π΅Π½ ΡΠ°ΠΉΠ»? Π ΡΠ°ΠΌΠΎ ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΡΠΈΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»Π½ΠΎΡΠΎ ΠΈΠΌΠ΅ "ΠΊΠ°Π½Π°Π»" ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Π·Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅, ΠΠ΅Π½ Π½Π°ΠΉ-Π½Π°ΠΊΡΠ°Ρ Π²ΡΠ·ΠΊΠ»ΠΈΠΊΠ½Π°: "Π©Π΅ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²Ρ!".
Π ΡΠΎΠΉ Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈ. Π Π΅Π΄Π½Π° ΡΡΠ΄Π±ΠΎΠ½ΠΎΡΠ½Π° Π²Π΅ΡΠ΅Ρ ΠΠ΅Π½ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΠ΄ΡΠΎΡΠΎ ΠΈ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°ΡΠ°, ΠΏΠΎΠΏΡΠ°Π²ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΈΡΠ°ΠΉΠΊΠΈ ΡΠ΅Ρ Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΏΡΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° Π²Ρ ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½ΠΈ (ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ΄Π²Π°Ρ ΠΎΡ ΠΊΠ°Π½Π°Π»ΠΈ), Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΠΈΠΌΠ΅Π½Π°ΡΠ° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅. ΠΠ° ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ Π΄Π΅Π½ ΠΊΠ°Π½Π°Π»ΠΈΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π° Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠΎΠΊΠΎ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°. ΠΠΎ ΠΊΡΠ°Ρ Π½Π° ΡΠ΅Π΄ΠΌΠΈΡΠ°ΡΠ° ΡΠ΅ΠΊΡΠ΅ΡΠ°ΡΠΊΠΈΡΠ΅ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π°, Π·Π° Π΄Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ ΠΎΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΈ Π½Π° ΠΏΡΠΈΠ½ΡΠ΅ΡΠ°. ΠΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ ΠΠ΅Π½ Π·Π°ΠΌΠ΅Π½ΠΈ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ API ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Π·Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°ΡΠ° Π½Π° ΠΊΠ°Π½Π°Π»ΠΈ Ρ ΠΏΠΎ-ΡΠΈΡΡΠΈ ΡΠΏΠΎΡΠ°Π·ΡΠΌΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΠΎΡΡΠΎΠ³Π°Π²Π° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ.
ΠΠ° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅, ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° ΡΡΠ΅ΡΠ°ΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΈΡ Π½Π° Unix Π΅ Π·Π°Π³ΡΠ±Π΅Π½. Π Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° C ΠΈΠ·Ρ ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π½Π° , ΠΊΠΎΡΡΠΎ ΠΈΠ·Π»Π΅Π·Π΅ ΠΏΡΠ΅Π· Π½ΠΎΠ΅ΠΌΠ²ΡΠΈ 1973, ΡΡ ΠΈΠ·Π»Π΅Π·Π΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠ΅ΡΠ° ΠΏΡΠ΅Π΄ΠΈ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ Π½Π΅ ΡΡΠ΄ΡΡΠΆΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΊΠ°Π½Π°Π»ΠΈΡΠ΅. ΠΠ°Π»ΠΊΠΎ Π΅, ΡΠ΅ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π½Π° Π»Π΅Π³Π΅Π½Π΄Π°ΡΠ½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π° Unix Π΅ Π·Π°Π³ΡΠ±Π΅Π½, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π·Π°Π²ΠΈΠ½Π°Π³ΠΈ.
ΠΠΌΠ°ΠΌΠ΅ ΡΠ΅ΠΊΡΡ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π·Π° pipe(2) ΠΈ ΠΎΡ Π΄Π²Π΅ΡΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΡ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΡΡΡΡΠ΅Π½Π΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° (ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π΄ΡΠΌΠΈ, ΠΏΠΎΠ΄ΡΠ΅ΡΡΠ°Π²Π°Π½ΠΈ βΡΡΡΠ½ΠΎβ, ΡΠ΅Π΄ Ρ Π»ΠΈΡΠ΅ΡΠ°Π»ΠΈ ^H, ΡΠ»Π΅Π΄ ΠΊΠΎΠΉΡΠΎ ΡΠ»Π΅Π΄Π²Π° Π΄ΠΎΠ»Π½Π° ΡΠ΅ΡΡΠ°!). Π’ΠΎΠ·ΠΈ ΠΏΡΠΎΡΠΎΡΠΈΠΏpipe(2) Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Π°ΡΠ΅ΠΌΠ±Π»Π΅Ρ ΠΈ Π²ΡΡΡΠ° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ, Π½ΠΎ Π²Π΅ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΎΡΠ°ΠΊΠ²Π°Π½Π°ΡΠ° ΠΎΡΠ½ΠΎΠ²Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ:
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ pipe ΡΡΠ·Π΄Π°Π²Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° Π²Ρ ΠΎΠ΄-ΠΈΠ·Ρ ΠΎΠ΄, Π½Π°ΡΠ΅ΡΠ΅Π½ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ. ΠΡΡΠ½Π°ΡΠΈΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ ΠΏΠΈΡΠ°Π½Π΅. ΠΠΎΠ³Π°ΡΠΎ Π½Π΅ΡΠΎ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ΅ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΡΠΎ ΡΠ΅ Π±ΡΡΠ΅ΡΠΈΡΠ° Π΄ΠΎ 504 Π±Π°ΠΉΡΠ° Π΄Π°Π½Π½ΠΈ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° Π·Π°ΠΏΠΈΡ ΡΠ΅ ΡΠΏΠΈΡΠ°. ΠΡΠΈ ΡΠ΅ΡΠ΅Π½Π΅ ΠΎΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, Π±ΡΡΠ΅ΡΠΈΡΠ°Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΡΠ΅ Π²Π·ΠΈΠΌΠ°Ρ.
ΠΠΎ ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° Π³ΠΎΠ΄ΠΈΠ½Π° ΡΠ΄ΡΠΎΡΠΎ Π±Π΅ΡΠ΅ ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° C, Π° ΠΏΡΠΈΠ΄ΠΎΠ±ΠΈ ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡ ΡΠΈ Π²ΠΈΠ΄ Ρ ΠΏΡΠΎΡΠΎΡΠΈΠΏΠ° βpipe(fildes)Β»:
Π‘ΠΈΡΡΠ΅ΠΌΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ pipe ΡΡΠ·Π΄Π°Π²Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° Π²Ρ ΠΎΠ΄-ΠΈΠ·Ρ ΠΎΠ΄, Π½Π°ΡΠ΅ΡΠ΅Π½ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ. ΠΡΡΠ½Π°ΡΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ ΠΏΠΈΡΠ°Π½Π΅. ΠΠΎΠ³Π°ΡΠΎ Π½Π΅ΡΠΎ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π° Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡΡ, Π²ΡΡΠ½Π°Ρ Π² r1 (ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° fildes[1]), ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΡΠ΅ΡΠΈΡΠ° Π΄ΠΎ 4096 Π±Π°ΠΉΡΠ° Π΄Π°Π½Π½ΠΈ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° Π·Π°ΠΏΠΈΡ ΡΠ΅ ΡΠΏΠΈΡΠ°. ΠΡΠΈ ΡΠ΅ΡΠ΅Π½Π΅ ΠΎΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡΡ, Π²ΡΡΠ½Π°Ρ Π² r0 (ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° fildes[0]), Π²Π·ΠΈΠΌΠ° Π΄Π°Π½Π½ΠΈ.
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΡΠ΅, ΡΠ΅ ΡΠ»Π΅Π΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π΄Π²Π° (ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅) Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ²Π°ΡΠΈ ΠΏΡΠΎΡΠ΅ΡΠ° (ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΈ ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ fork) ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ Π΄Π°Π½Π½ΠΈ ΠΎΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ read ΠΈ write.
Π ΡΠ΅Π» ΠΈΠΌΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ΅Π½ ΠΌΠ°ΡΠΈΠ² ΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΡΡΠ΅Π· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ.
ΠΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ° Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΠΎΡ ΠΏΡΠ°Π·Π΅Π½ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ (ΠΊΠΎΠΉΡΠΎ Π½Π΅ ΡΡΠ΄ΡΡΠΆΠ° Π±ΡΡΠ΅ΡΠΈΡΠ°Π½ΠΈ Π΄Π°Π½Π½ΠΈ), ΠΊΠΎΠΉΡΠΎ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΊΡΠ°ΠΉ (Π·Π°ΠΏΠΈΡΠ²Π°ΡΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ ΡΠ° Π·Π°ΡΠ²ΠΎΡΠ΅Π½ΠΈ), Π²ΡΡΡΠ°Ρ βΠΊΡΠ°ΠΉ Π½Π° ΡΠ°ΠΉΠ»Π°β. ΠΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡΡΠ° Π·Π° Π·Π°ΠΏΠΈΡ Π² Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π° ΡΠΈΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΠ°Ρ.
ΠΠ°ΠΉ-ΡΠ°Π½Π½Π°ΡΠ° ΡΠ΅ ΠΎΡΠ½Π°ΡΡ (ΡΠ½ΠΈ 1974 Π³.), Π½ΠΎ Π΅ ΠΏΠΎΡΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Π° Π½Π° ΡΠ°Π·ΠΈ, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. Π‘Π°ΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ Π° ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΠ΅ΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΏΡΡΠ½Π΅.
Π¨Π΅ΡΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix (1975)
ΠΠ°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ Π΄Π° ΡΠ΅ΡΠ΅ΠΌ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° Unix (ΠΌΠ°ΠΉ 1975 Π³.). ΠΠΎ Π³ΠΎΠ»ΡΠΌΠ° ΡΡΠ΅ΠΏΠ΅Π½ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° Lions Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ΅ΡΠΈΠΌ, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΠΎ-ΡΠ°Π½Π½ΠΈ Π²Π΅ΡΡΠΈΠΈ:
ΠΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΊΠ½ΠΈΠ³Π°ΡΠ° 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 Π·Π° ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡ ΠΈ Π²ΡΡΡΠ°Π½Π΅ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ.
ΠΠ΅ΠΊΠ° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π½Π° Π΄ΠΈΡΠΊΠ° , Π° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° β Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π΄Π²Π° . ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ ΠΌΠΈΠ½Π΅ Π΄ΠΎΠ±ΡΠ΅, ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅ΠΌ ΡΠ»Π°Π³ΠΎΠ²Π΅, Π·Π° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΡΠ΅Π·ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΊΠ°ΡΠΎ Π΄Π²Π° ΠΊΡΠ°Ρ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΡΠ΅ Π³ΠΈ ΠΏΠΎΡΠΎΡΠΈΠΌ Π² ΡΡΡΠΈΡ inode (ΡΠΈΠΉΡΠΎ Π±ΡΠΎΠΉ Π½Π° ΠΏΡΠ΅ΠΏΡΠ°ΡΠΊΠΈ ΡΠ΅ ΡΡΠ°Π½Π΅ 2) ΠΈ ΡΠ΅ ΠΌΠ°ΡΠΊΠΈΡΠ°ΠΌΠ΅ inode ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½. ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡΡΠ° ΠΊΡΠΌ Π² Π³ΡΠ΅ΡΠ½ΠΈ ΠΏΡΡΠΈΡΠ° (error paths), Π·Π° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ Π±ΡΠΎΡ Π½Π° ΠΏΡΠ΅ΠΏΡΠ°ΡΠΊΠΈΡΠ΅ Π² Π½ΠΎΠ²ΠΈΡ inode.
pipe() ΡΡΡΠ±Π²Π° Π΄Π° Π²ΡΡΡΠ° R0 ΠΈ R1 Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈΡΠ΅ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΈ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ Π·Π°ΠΏΠΈΡ. falloc() Π²ΡΡΡΠ° ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²Π°ΡΠ° ΡΡΡΡΠΊΡΡΡΠ°, Π½ΠΎ ΡΡΡΠΎ ΡΠ°ΠΊΠ° "Π²ΡΡΡΠ°" ΡΡΠ΅Π· u.u_ar0[R0] ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ. Π’ΠΎΠ΅ΡΡ ΠΊΠΎΠ΄ΡΡ Π·Π°ΠΏΠ°Π·Π²Π° Π² r ΡΠ°ΠΉΠ»ΠΎΠ²ΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ ΠΈ ΠΏΡΠΈΡΠ²ΠΎΡΠ²Π° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° Π·Π° Π·Π°ΠΏΠΈΡ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡ u.u_ar0[R0] ΡΠ»Π΅Π΄ Π²ΡΠΎΡΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ falloc().
ΠΠ½Π°ΠΌΠ΅ FPIPE, ΠΊΠΎΠΉΡΠΎ Π·Π°Π΄Π°Π΄ΠΎΡ
ΠΌΠ΅ ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°, ΡΠΏΡΠ°Π²Π»ΡΠ²Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° , ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΡΠ° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅-ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ 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)
{
ΡΠ΅Π³ΠΈΡΡΡΡ *rp, *ip, c;
rp = fp;
ip = rp->f_inode;
c = u.u_count;
loop:
/* ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ, Π²ΡΡΠ½Π΅ΡΠ΅. */
plock(ip);
if(c == 0) {
prele(ip);
u.u_count = 0;
return;
}
/*
* ΠΠΊΠΎ Π½Π΅ ΠΈ Π΄Π²Π΅ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ΅Π½ΠΈ ΠΈ Π·Π°ΠΏΠΈΡΠ²Π°ΡΠΈ ΡΡΡΠ°Π½ΠΈ Π½Π°
* ΡΡΡΠ±Π°ΡΠ° ΡΠ° Π°ΠΊΡΠΈΠ²Π½ΠΈ, Π²ΡΡΠ½Π΅ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ° ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ ΡΡΡΠΎ.
*//
if(ip->i_count i_size1 == PIPSIZ) {
ip->i_mode = | IWRITE;
prele(ip);
sleep(ip+1, PPIPE);
goto loop;
}
/* ΠΠ°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎΡΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΡΠ΅ Π²ΡΡΠ½Π΅ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ. */
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-a (ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΡΠ°Π²Π½ΠΎ Π½Π° 0 ΠΏΡΠΈ ΠΏΡΠ°Π·Π΅Π½ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ) ΡΠΊΠ°Π·Π²Π° Π½Π° ΠΊΡΠ°Ρ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π²Π΅ΡΠ΅ ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ°Ρ Π² Π½Π΅Π³ΠΎ. ΠΠΊΠΎ ΠΈΠΌΠ° Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΌΡΡΡΠΎ Π·Π° Π·Π°ΠΏΠΈΡ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΡΠ»Π½ΠΈΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΎΡ i_size1 Π΄ΠΎ PIPESIZ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ²Π°Π»ΡΠΌΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°ΡΠ° ΠΈ ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π΄Π° ΠΏΡΠΈΠ²Π΅Π΄Π΅ΠΌ Π² ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° Π±ΡΠ΄Π½ΠΎΡΡ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠΎΡΠ΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠ°ΠΊΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ ΠΎΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°. ΠΡΡΡΠ°ΠΌΠ΅ ΡΠ΅ Π² Π½Π°ΡΠ°Π»ΠΎΡΠΎ, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»ΠΈ ΡΠΌΠ΅ ΡΡΠΏΠ΅Π»ΠΈ Π΄Π° Π·Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π±Π°ΠΉΡΠΎΠ²Π΅, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π½ΠΈ Π±ΡΡ
Π° Π½ΡΠΆΠ½ΠΈ. ΠΠΊΠΎ Π½Π΅ ΡΡΠΏΠ΅Π΅ΠΌ, Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ Π½ΠΎΠ² ΡΠΈΠΊΡΠ» Π½Π° Π·Π°ΠΏΠΈΡ.
ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΡΡ i_mode Π½Π° inode-a ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡΡ
ΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡΡΠ° r, w ΠΈ x. ΠΠΎ Π² ΡΠ»ΡΡΠ°Ρ Ρ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΈΡΠ΅ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π·Π° ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅ΡΠΎ ΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ, ΠΊΠΎΠΉΡΠΎ Π·Π°ΠΏΠΈΡΠ²Π° ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π±ΠΈΡΠΎΠ²Π΅ΡΠ΅ IREAD ΠΈ IWRITE ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ. ΠΡΠΎΡΠ΅ΡΡΡ Π·Π°Π΄Π°Π²Π° ΡΠ»Π°Π³Π° ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π° sleep(), ΠΈ ΡΠ΅ ΠΎΡΠ°ΠΊΠ²Π°, ΡΠ΅ Π² Π±ΡΠ΄Π΅ΡΠ΅ Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ° wakeup().
ΠΡΡΠΈΠ½ΡΠΊΠΎΡΠΎ ΡΡΠ΄ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° Π² sleep() ΠΈ wakeup(). Π’Π΅ ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π² , ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΈΡ ΠΊΠΎΠΌΠ΅Π½ΡΠ°Ρ βΠΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π³ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°Ρβ (You are not expected to understand this). ΠΠ° ΡΠ°ΡΡΠΈΠ΅, Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΡΠ°Π·Π±ΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ΄Π°, ΠΏΡΠΎΡΡΠΎ ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ Π½ΡΠΊΠΎΠΈ ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈ:
/*
* 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:
/* ΠΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ²Π°ΡΠΈΠ²Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. */
plock(ip);
/*
* ΠΡΠ»ΠΈ Π³ΠΎΠ»ΠΎΠ²Π° (ΡΡΠ΅Π½ΠΈΠ΅) Π΄ΠΎΠ³Π½Π°Π»Π°
* ΠΊΠΎΠ½Π΅Ρ (Π·Π°ΠΏΠΈΡΡ), ΡΠ±ΡΠΎΡΠΈΡΡ ΠΎΠ±Π° Π² 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);
}
}
/*
* ΠΡΠ»ΠΈ Π½Π΅ Π°ΠΊΡΠΈΠ²Π½Ρ Π½ΠΈ ΡΠΈΡΠ°ΡΠ΅Π»Ρ, Π½ΠΈ
* ΠΏΠΈΡΠ°ΡΠ΅Π»Ρ, Π²ΡΠΉΡΠΈ Π±Π΅Π·
* ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π½ΠΈΡ.
* /
prele(ip);
if(ip->i_count i_mode |= IREAD;
sleep(ip+2, PPIPE);
goto loop;
}
/* Π§ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΠΎΠ·Π²ΡΠ°Ρ */
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 Π½Π° inode-Π°. ΠΠΈΠ΅ Π½ΡΠ»ΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΡΡΠ° ΠΈ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π΄Π° ΡΡΠ±ΡΠ΄ΠΈΠΌ Π²ΡΡΠΊΠ°ΠΊΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, ΠΊΠΎΡΡΠΎ ΠΈΡΠΊΠ° Π΄Π° Π·Π°ΠΏΠΈΡΠ΅ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ°. ΠΠΈΠ΅ Π·Π½Π°Π΅ΠΌ, ΡΠ΅ ΠΊΠΎΠ³Π°ΡΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΡΡ Π΅ ΠΏΡΠ»Π΅Π½, 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() Π΄Π° Π²ΡΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈ ΡΠΈΠΊΡΠ»Π°.
Π‘ ΡΠΎΠ²Π° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΈΡΠ΅ Π² ΡΠ΅ΡΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΈΡ Π΅ ΠΏΡΠΈΠΊΠ»ΡΡΠ΅Π½ΠΎ. ΠΡΠΎΡΡ ΠΊΠΎΠ΄, Π΄Π°Π»Π΅ΡΠ½ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ.
(ΡΠ½ΡΠ°ΡΠΈ 1979) Π±Π΅ΡΠ΅ Π½ΠΎΠ²ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (ΡΠ»Π΅Π΄ ΡΠ΅ΡΠΈΡΠΈ Π³ΠΎΠ΄ΠΈΠ½ΠΈ), Π² ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ Π° ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π½Π° ΡΠ΄ΡΠΎΡΠΎ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π² Π½Π΅Π³ΠΎ ΠΈΠΌΠ°ΡΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ΠΈΡ Π½Π° ΡΠΈΠΏΠΎΠ²Π΅, union-ΠΈ ΠΈ ΡΠΈΠΏΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΡΡΡΡΠΊΡΡΡΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π° ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ ΡΠ΅ Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ». ΠΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΡΠΎΠΏΡΡΠ½Π΅ΠΌ ΡΠΎΠ²Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅.
Xv6, ΠΏΡΠΎΡΡΠΎ ΡΠ΄ΡΠΎ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° Unix
Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π΅ ΠΏΠΎΠ²Π»ΠΈΡΠ½ΠΎ ΠΎΡ ΡΠ΅ΡΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΈΡ Π½Π° Unix, Π½ΠΎ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° ΠΌΠΎΠ΄Π΅ΡΠ΅Π½ C, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° Π½Π° x86 ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ. ΠΠΎΠ΄ΡΡ Π»Π΅ΡΠ½ΠΎ ΡΠ΅ ΡΠ΅ΡΠ΅, Π΅ ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΠΌ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Π·Π° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° Unix ΠΎΡ TUHS, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΡΠ΅, ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠ°ΡΠ΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° Π½Π΅ΡΠΎ Π΄ΡΡΠ³ΠΎ, ΠΎΡΠ²Π΅Π½ PDP 11/70. ΠΠ°ΡΠΎΠ²Π° ΡΠΎΠ²Π° ΡΠ΄ΡΠΎ Π΅ ΡΠΈΡΠΎΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΎ Π² ΡΠ½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠΈΡΠ΅ ΠΊΠ°ΡΠΎ ΡΡΠ΅Π±Π΅Π½ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π» Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ. ΠΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΊΠΎΠ΄ΠΎΠ²Π΅ .
ΠΠΎΠ΄ΡΡ ΡΡΠ΄ΡΡΠΆΠ° ΡΠ°Π·Π±ΠΈΡΠ°Π΅ΠΌΠ° ΠΈ ΠΎΠ±ΠΌΠΈΡΠ»Π΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ , ΠΏΠΎΠ΄ΡΠΈΠ»Π΅Π½Π° Ρ Π±ΡΡΠ΅Ρ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π²ΠΌΠ΅ΡΡΠΎ 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 Π΅ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π² . ΠΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΡΠ΅Π»ΠΈΡ ΠΌΡ ΠΊΠΎΠ΄. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΅ Π½Π° Π½ΠΈΠ²ΠΎ ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΡΠ΅ΡΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΈΡ, Π½ΠΎ ΡΠ΅ ΡΠ΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ ΠΈ ΠΏΡΠΈΡΡΠ½ΠΎ.
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< 0) {
while (PIPE_FULL(*inode)) {
wake_up(&inode->i_wait);
if (inode->i_count != 2) {
current->signal |= (1<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 Π³. ββ Π΅ ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° Π½Π°ΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΡΡ (Π²ΡΠ΅ ΠΎΡΠ΅) ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅ Π² Linux. Π ΠΈΠ»ΡΡΡΡΠΈΡΠ° ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄ΠΈ, ΡΠΈΠΉΡΠΎ ΠΊΠ°ΠΏΠ°ΡΠΈΡΠ΅Ρ Π½Π°Π΄Ρ
Π²ΡΡΠ»Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΡΠ° Π½Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅; Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠΎΠ»ΠΊΠΎ Π΄Π°Π»Π΅Ρ ΡΠ° ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ»ΠΈ ΡΡΡΠ±ΠΎΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅ ΠΎΡ βΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΡΠ²Π°ΡΠΈΠ²Π½Π°ΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°β Π² ΡΠ΅ΡΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° ΡΠ΄ΡΠΎ Unix.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
