Како сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π°Ρ‚ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ Π²ΠΎ Unix

Како сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π°Ρ‚ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ Π²ΠΎ Unix
Оваа ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ја ΠΎΠΏΠΈΡˆΡƒΠ²Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Unix. Π‘Π΅Π² ΠΌΠ°Π»ΠΊΡƒ Ρ€Π°Π·ΠΎΡ‡Π°Ρ€Π°Π½ ΡˆΡ‚ΠΎ Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π΅ΡˆΠ½Π°Ρ‚Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° со наслов β€žΠšΠ°ΠΊΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π½Π°Ρ„Ρ‚ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ Π²ΠΎ Unix?Β» испадна НСма Π·Π° Π²Π½Π°Ρ‚Ρ€Π΅ΡˆΠ½Π°Ρ‚Π° структура. Π‘Π΅ заинтСрСсирав ΠΈ ΠΊΠΎΠΏΠ°Π² Π²ΠΎ старитС ΠΈΠ·Π²ΠΎΡ€ΠΈ Π·Π° Π΄Π° Π³ΠΎ најдам ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ΠΎΡ‚.

Π—Π° ΡˆΡ‚ΠΎ Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅?

Π¦Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ сС β€žΠ²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ Π½Π°Ρ˜Π²Π°ΠΆΠ½ΠΈΠΎΡ‚ ΠΈΠ·ΡƒΠΌ Π²ΠΎ Unixβ€œ - Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‡ΠΊΠ° карактСристика Π½Π° основната Ρ„ΠΈΠ»ΠΎΠ·ΠΎΡ„ΠΈΡ˜Π° Π½Π° Unix Π·Π° ΡΠΎΡΡ‚Π°Π²ΡƒΠ²Π°ΡšΠ΅ ΠΌΠ°Π»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΈ ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈΠΎΡ‚ слоган ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Π½Π°Ρ‚Π° линија:

$ echo hello | wc -c
6

Оваа функционалност зависи ΠΎΠ΄ систСмскиот ΠΏΠΎΠ²ΠΈΠΊ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½ ΠΎΠ΄ Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ pipe, ΡˆΡ‚ΠΎ Π΅ опишано Π½Π° страницитС со Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Ρ†Π΅Π²ΠΊΠ° (7) ΠΈ Ρ†Π΅Π²ΠΊΠ° (2):

Π¦Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π°Π°Ρ‚ СднонасочСн ΠΊΠ°Π½Π°Π» Π·Π° мСѓупроцСсна ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°. Гасоводот ΠΈΠΌΠ° Π²Π»Π΅Π· (ΠΊΡ€Π°Ρ˜ Π·Π° Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅) ΠΈ ΠΈΠ·Π»Π΅Π· (ΠΊΡ€Π°Ρ˜ Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅). ΠŸΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ запишани Π½Π° Π²Π»Π΅Π·ΠΎΡ‚ Π½Π° гасоводот ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ‡ΠΈΡ‚Π°Π°Ρ‚ Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ‚.

Гасоводот сС создава со ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΡšΠ΅ pipe(2), кој Π²Ρ€Π°ΡœΠ° Π΄Π²Π° дСскриптори Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ: Π΅Π΄Π½ΠΈΠΎΡ‚ сС однСсува Π½Π° Π²Π»Π΅Π·ΠΎΡ‚ Π½Π° гасоводот, Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ‚.

Π˜Π·Π»Π΅Π·ΠΎΡ‚ Π·Π° Ρ‚Ρ€Π°Π³Π° ΠΎΠ΄ Π³ΠΎΡ€Π½Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π³ΠΎ дСмонстрира ΡΠΎΠ·Π΄Π°Π²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΡ‚ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π½ΠΈΠ· Π½Π΅Π³ΠΎ ΠΎΠ΄ Π΅Π΄Π΅Π½ процСс Π΄ΠΎ Π΄Ρ€ΡƒΠ³:

$ strace -qf -e execve,pipe,dup2,read,write 
    sh -c 'echo hello | wc -c'

execve("/bin/sh", ["sh", "-c", "echo hello | wc -c"], …)
pipe([3, 4])                            = 0
[pid 2604795] dup2(4, 1)                = 1
[pid 2604795] write(1, "hellon", 6)    = 6
[pid 2604796] dup2(3, 0)                = 0
[pid 2604796] execve("/usr/bin/wc", ["wc", "-c"], …)
[pid 2604796] read(0, "hellon", 16384) = 6
[pid 2604796] write(1, "6n", 2)        = 2

РодитСлскиот процСс ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° pipe()Π·Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΊΠ°Ρ‡Π΅Π½ΠΈ дСскриптори Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ. Π•Π΄Π΅Π½ Π΄Π΅Ρ‚Π΅ процСс ΠΏΠΈΡˆΡƒΠ²Π° Π½Π° Π΅Π΄Π΅Π½ дСскриптор, Π° Π΄Ρ€ΡƒΠ³ процСс Π³ΠΈ Ρ‡ΠΈΡ‚Π° иститС ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ дСскриптор. Π¨ΠΊΠΎΠ»ΠΊΠ°Ρ‚Π° Π³ΠΈ β€žΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ²Π°β€œ дСскрипторитС 2 ΠΈ 3 со dup4 Π·Π° Π΄Π° ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Π°Ρ‚ Π½Π° stdin ΠΈ stdout.

Π‘Π΅Π· Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ, ΡˆΠΊΠΎΠ»ΠΊΠ°Ρ‚Π° Π±ΠΈ ΠΌΠΎΡ€Π°Π»Π° Π΄Π° Π³ΠΎ запишС ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ ΠΎΠ΄ Π΅Π΄Π΅Π½ процСс Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΈ Π΄Π° Π³ΠΎ прСнСсС Π²ΠΎ Π΄Ρ€ΡƒΠ³ процСс Π·Π° Π΄Π° Π³ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΎΠ΄ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°. Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, ќС ΠΏΠΎΡ‚Ρ€ΠΎΡˆΠΈΠΌΠ΅ повСќС рСсурси ΠΈ простор Π½Π° дискот. Π‘Π΅ΠΏΠ°ΠΊ, Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ сС Π΄ΠΎΠ±Ρ€ΠΈ Π·Π° повСќС ΠΎΠ΄ само ΠΈΠ·Π±Π΅Π³Π½ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΈΠ²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ:

Ако нСкој процСс сС ΠΎΠ±ΠΈΠ΄Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π° ΠΎΠ΄ ΠΏΡ€Π°Π·Π΅Π½ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄, Ρ‚ΠΎΠ³Π°Ρˆ read(2) ќС Π±Π»ΠΎΠΊΠΈΡ€Π° Π΄ΠΎΠ΄Π΅ΠΊΠ° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π½Π΅ Π±ΠΈΠ΄Π°Ρ‚ достапни. Ако нСкој процСс сС ΠΎΠ±ΠΈΠ΄Π΅ Π΄Π° запишС Π½Π° цСлосСн гасовод, Ρ‚ΠΎΠ³Π°Ρˆ write(2) ќС Π±Π»ΠΎΠΊΠΈΡ€Π° Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ сС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π°Ρ‚ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΎΠ΄ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ‚ Π·Π° Π΄Π° сС Π·Π°Π²Ρ€ΡˆΠΈ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ.

Како ΠΈ Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ POSIX, ΠΎΠ²Π° Π΅ Π²Π°ΠΆΠ½Π° особина: ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π΄ΠΎ гасоводот Π΄ΠΎ PIPE_BUF Π±Π°Ρ˜Ρ‚ΠΈ (Π½Π°Ρ˜ΠΌΠ°Π»ΠΊΡƒ 512) ΠΌΠΎΡ€Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ атомски Π·Π° процСситС Π΄Π° ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° ΠΊΠΎΠΌΡƒΠ½ΠΈΡ†ΠΈΡ€Π°Π°Ρ‚ Π΅Π΄Π½ΠΈ со Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€Π΅ΠΊΡƒ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ‚ Π½Π° Π½Π°Ρ‡ΠΈΠ½ Π½Π° кој Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΈΡ‚Π΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ (ΠΊΠΎΠΈ Π½Π΅ Π΄Π°Π²Π°Π°Ρ‚ Ρ‚Π°ΠΊΠ²ΠΈ Π³Π°Ρ€Π°Π½Ρ†ΠΈΠΈ) Π½Π΅ ΠΌΠΎΠΆΠ°Ρ‚.

Π‘ΠΎ ΠΎΠ±ΠΈΡ‡Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°, процСсот ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ запишС Ρ†Π΅Π»ΠΈΠΎΡ‚ Π½Π΅Π³ΠΎΠ² ΠΈΠ·Π»Π΅Π· ΠΈ Π΄Π° Π³ΠΎ ΠΏΡ€Π΅Π΄Π°Π΄Π΅ Π½Π° Π΄Ρ€ΡƒΠ³ процСс. Или процСситС ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π²ΠΎ Ρ‚Π²Ρ€Π΄ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ, ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π½Π°Π΄Π²ΠΎΡ€Π΅ΡˆΠ΅Π½ сигналСн ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ (ΠΊΠ°ΠΊΠΎ сСмафор) Π·Π° Π΄Π° сС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π°Ρ‚ мСѓусСбно Π·Π° Π·Π°Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ ΠΈΠ»ΠΈ Ρ‡ΠΈΡ‚Π°ΡšΠ΅Ρ‚ΠΎ. ВранспортСритС Π½Π΅ спасуваат ΠΎΠ΄ сСта ΠΎΠ²Π°Π° ΠΌΠ°ΠΊΠ°.

Π¨Ρ‚ΠΎ Π±Π°Ρ€Π°ΠΌΠ΅?

ЌС Π²ΠΈ објаснам Π½Π° прсти Π·Π° полСсно Π΄Π° замислитС ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ транспортСр. ЌС Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π΄ΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ Π±Π°Ρ„Π΅Ρ€ ΠΈ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π°. ЌС Π²ΠΈ Ρ‚Ρ€Π΅Π±Π°Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° додавањС ΠΈ ΠΎΡ‚ΡΡ‚Ρ€Π°Π½ΡƒΠ²Π°ΡšΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΎΠ΄ Π±Π°Ρ„Π΅Ρ€ΠΎΡ‚. ЌС Π²ΠΈ Ρ‚Ρ€Π΅Π±Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° моТност Π·Π° ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΡšΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΈ ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° дСскриптори Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ. И Π±Ρ€Π°Π²ΠΈΡ‚Π΅ сС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ Π·Π° ΡΠΏΡ€ΠΎΠ²Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° посСбното ΠΎΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ опишано ΠΏΠΎΠ³ΠΎΡ€Π΅.

Π‘Π΅Π³Π° смС ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ Π΄Π° Π³ΠΎ испитамС ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ ΠΏΠΎΠ΄ силно свСтло Π½Π° свСтилката Π·Π° Π΄Π° Π³ΠΎ ΠΏΠΎΡ‚Π²Ρ€Π΄ΠΈΠΌΠ΅ ΠΈΠ»ΠΈ ΠΎΡ‚Ρ„Ρ€Π»ΠΈΠΌΠ΅ Π½Π°ΡˆΠΈΠΎΡ‚ нСјасСн ΠΌΠ΅Π½Ρ‚Π°Π»Π΅Π½ ΠΌΠΎΠ΄Π΅Π». Но, сСкогаш Π±ΠΈΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ΠΈ Π·Π° Π½Π΅ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°Π½ΠΎΡ‚ΠΎ.

КадС Π±Π°Ρ€Π°ΠΌΠ΅?

НС Π·Π½Π°ΠΌ ΠΊΠ°Π΄Π΅ сС Π½Π°ΠΎΡ“Π° ΠΌΠΎΡ˜ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ ΠΎΠ΄ ΠΏΠΎΠ·Π½Π°Ρ‚Π°Ρ‚Π° ΠΊΠ½ΠΈΠ³Π°.Π›Π°Π²ΠΎΠ²ΠΈ ΠΊΠ½ΠΈΠ³Π°Β« со ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° Unix 6, Π½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Π”Ρ€ΡƒΡˆΡ‚Π²ΠΎΡ‚ΠΎ Π·Π° наслСдство Π½Π° Уникс ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π° Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΈΠ·Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ Π΄ΡƒΡ€ΠΈ ΠΈ постари Π²Π΅Ρ€Π·ΠΈΠΈ Π½Π° Unix.

Π’Π°Π»ΠΊΠ°ΡšΠ΅Ρ‚ΠΎ Π½ΠΈΠ· Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ‚Π΅ Π½Π° TUHS Π΅ ΠΊΠ°ΠΊΠΎ посСта Π½Π° ΠΌΡƒΠ·Π΅Ρ˜. МоТСмС Π΄Π° ја ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° Π·Π°Π΅Π΄Π½ΠΈΡ‡ΠΊΠ° ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π° ΠΈ ΠΈΠΌΠ°ΠΌ ΠΏΠΎΡ‡ΠΈΡ‚ Π·Π° Π³ΠΎΠ΄ΠΈΠ½ΠΈΡ‚Π΅ Π½Π°ΠΏΠΎΡ€ Π΄Π° Π³ΠΎ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π°ΠΌ Ρ†Π΅Π»ΠΈΠΎΡ‚ овој ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π» ΠΌΠ°Π»ΠΊΡƒ ΠΏΠΎ ΠΌΠ°Π»ΠΊΡƒ ΠΎΠ΄ старитС касСти ΠΈ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΎΡ†ΠΈ. И јас сум Π°ΠΊΡƒΡ‚Π½ΠΎ свСсСн Π·Π° ΠΎΠ½ΠΈΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈ ΡˆΡ‚ΠΎ сè ΡƒΡˆΡ‚Π΅ нСдостасуваат.

ΠžΡ‚ΠΊΠ°ΠΊΠΎ ја Π·Π°Π΄ΠΎΠ²ΠΎΠ»ΠΈΠ²ΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° љубопитност Π·Π° Π°Π½Ρ‚ΠΈΡ‡ΠΊΠ°Ρ‚Π° ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π° Π½Π° Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΡ‚Π΅ Ρ˜Π°Π΄Ρ€Π° Π·Π° спорСдба.

ΠŸΠ°Ρ‚Π΅ΠΌ, pipe Π΅ систСмски ΠΏΠΎΠ²ΠΈΠΊ Π±Ρ€ΠΎΡ˜ 42 Π²ΠΎ Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π° sysent[]. Π‘Π»ΡƒΡ‡Π°Ρ˜Π½ΠΎΡΡ‚?

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈ Unix ΠΊΠ΅Ρ€Π½Π΅Π»ΠΈ (1970–1974)

НС најдов Π½ΠΈΠΊΠ°ΠΊΠ²Π° Ρ‚Ρ€Π°Π³Π° pipe(2) Π½ΠΈΡ‚Ρƒ Π²ΠΎ PDP-7 Unix (Ρ˜Π°Π½ΡƒΠ°Ρ€ΠΈ 1970), Π½ΠΈΡ‚Ρƒ Π²ΠΎ ΠΏΡ€Π²ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Unix (Π½ΠΎΠ΅ΠΌΠ²Ρ€ΠΈ 1971), Π½ΠΈΡ‚Ρƒ Π²ΠΎ нСцСлосСн ΠΈΠ·Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ Π²Ρ‚ΠΎΡ€ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (Ρ˜ΡƒΠ½ΠΈ 1972).

Π’Π£Π₯Π‘ Π³ΠΎ Ρ‚Π²Ρ€Π΄ΠΈ Ρ‚ΠΎΠ° Ρ‚Ρ€Π΅Ρ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Unix (Ρ„Π΅Π²Ρ€ΡƒΠ°Ρ€ΠΈ 1973 Π³ΠΎΠ΄ΠΈΠ½Π°) бСшС ΠΏΡ€Π²Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° со Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ:

Π’Ρ€Π΅Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix бСшС послСдната Π²Π΅Ρ€Π·ΠΈΡ˜Π° со ΠΊΠ΅Ρ€Π½Π΅Π» напишано Π²ΠΎ асСмблСр, Π½ΠΎ ΠΈ ΠΏΡ€Π²Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° со Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ. Π’ΠΎ Ρ‚Π΅ΠΊΠΎΡ‚ Π½Π° 1973 Π³ΠΎΠ΄ΠΈΠ½Π°, сС Ρ€Π°Π±ΠΎΡ‚Π΅ΡˆΠ΅ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ‚Ρ€Π΅Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅, ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ бСшС ΠΏΡ€Π΅ΠΏΠΈΡˆΠ°Π½ Π²ΠΎ C ΠΈ Ρ‚Π°ΠΊΠ° сС Ρ€ΠΎΠ΄ΠΈ Ρ‡Π΅Ρ‚Π²Ρ€Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix.

Π•Π΄Π΅Π½ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π» ΠΏΡ€ΠΎΠ½Π°ΡˆΠΎΠ» ΡΠΊΠ΅Π½ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π²ΠΎ кој Π”Π°Π³ ΠœΠ΅ΠΊΠΈΠ»Ρ€ΠΎΡ˜ ја ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΈΠ΄Π΅Ρ˜Π°Ρ‚Π° Π·Π° β€žΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΊΠ°ΠΊΠΎ градинарско Ρ†Ρ€Π΅Π²ΠΎβ€œ.

Како сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π°Ρ‚ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ Π²ΠΎ Unix
Π’ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Π½Π° Π‘Ρ€Π°Ρ˜Π°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½Unix: Π˜ΡΡ‚ΠΎΡ€ΠΈΡ˜Π° ΠΈ ΠΌΠ΅ΠΌΠΎΠ°Ρ€ΠΈβ€œ, ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΏΠΎΡ˜Π°Π²Π°Ρ‚Π° Π½Π° транспортСри Π³ΠΎ спомСнува ΠΈ овој Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚: β€ž... 30 Π³ΠΎΠ΄ΠΈΠ½ΠΈ висСшС Π½Π° Ρ•ΠΈΠ΄ΠΎΡ‚ Π²ΠΎ ΠΌΠΎΡ˜Π°Ρ‚Π° ΠΊΠ°Π½Ρ†Π΅Π»Π°Ρ€ΠΈΡ˜Π° Π²ΠΎ Bell Labsβ€œ. Π•Π²Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Ρ˜Ρƒ со ΠœΠ΅ΠΊΠΈΠ»Ρ€ΠΎΡ˜ΠΈ ΡƒΡˆΡ‚Π΅ Π΅Π΄Π½Π° ΠΏΡ€ΠΈΠΊΠ°Π·Π½Π° ΠΎΠ΄ Π”Π΅Π»ΠΎΡ‚ΠΎ Π½Π° ΠœΠ΅ΠΊΠΈΠ»Ρ€ΠΎΡ˜, напишано Π²ΠΎ 2014 Π³ΠΎΠ΄ΠΈΠ½Π°:

Кога сС појави Unix, ΠΌΠΎΡ˜Π°Ρ‚Π° страст Π·Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈ ΠΌΠ΅ Π½Π°Ρ‚Π΅Ρ€Π° Π΄Π° ΠΏΠΎΠ±Π°Ρ€Π°ΠΌ ΠΎΠ΄ Π°Π²Ρ‚ΠΎΡ€ΠΎΡ‚ Π½Π° ОБ, КСн Вомпсон, Π΄Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ запишани Π²ΠΎ нСкој процСс Π΄Π° ΠΎΠ΄Π°Ρ‚ Π½Π΅ само Π΄ΠΎ ΡƒΡ€Π΅Π΄ΠΎΡ‚, Ρ‚ΡƒΠΊΡƒ ΠΈ Π΄ΠΎ ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ процСс. КСн мислСшС Π΄Π΅ΠΊΠ° Ρ‚ΠΎΠ° Π΅ ΠΌΠΎΠΆΠ½ΠΎ. Π‘Π΅ΠΏΠ°ΠΊ, ΠΊΠ°ΠΊΠΎ минималист, Ρ‚ΠΎΡ˜ сакашС сСкоја карактСристика Π½Π° систСмот Π΄Π° ΠΈΠ³Ρ€Π° Π·Π½Π°Ρ‡Π°Ρ˜Π½Π° ΡƒΠ»ΠΎΠ³Π°. Π”Π°Π»ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ ΠΏΠΎΠΌΠ΅Ρ“Ρƒ процСситС навистина Π΅ Π³ΠΎΠ»Π΅ΠΌΠ° прСдност Π²ΠΎ однос Π½Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π²ΠΎ срСдна Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°? И Π΄ΡƒΡ€ΠΈ ΠΊΠΎΠ³Π° Π΄Π°Π΄ΠΎΠ² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΠΏΡ€Π΅Π΄Π»ΠΎΠ³ со ΠΏΡ€ΠΈΠ²Π»Π΅Ρ‡Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ β€žΡ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄β€œ ΠΈ опис Π½Π° синтаксата Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° процСситС, КСн ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ°: β€žΠŒΠ΅ Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π°ΠΌ Ρ‚ΠΎΠ°!β€œ.

И Π½Π°ΠΏΡ€Π°Π²ΠΈ. Π•Π΄Π½Π° судбоносна Π²Π΅Ρ‡Π΅Ρ€, КСн Π³ΠΈ смСни ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΈ школка, ΠΏΠΎΠΏΡ€Π°Π²ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ стандардни ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π·Π° Π΄Π° Π³ΠΎ стандардизира Π½Π°Ρ‡ΠΈΠ½ΠΎΡ‚ Π½Π° ΠΏΡ€ΠΈΡ„Π°ΡœΠ°ΡšΠ΅ Π½Π° Π²Π»Π΅Π·ΠΎΡ‚ (ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° дојдС ΠΎΠ΄ гасоводот) ΠΈ Π³ΠΈ смСни ΠΈΠΌΠΈΡšΠ°Ρ‚Π° Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅. Π‘Π»Π΅Π΄Π½ΠΈΠΎΡ‚ Π΄Π΅Π½, Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ Π±Π΅Π° ΠΌΠ½ΠΎΠ³Ρƒ ΡˆΠΈΡ€ΠΎΠΊΠΎ користСни Π²ΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈΡ‚Π΅. Π”ΠΎ ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Π½Π° Π½Π΅Π΄Π΅Π»Π°Ρ‚Π°, сСкрСтаритС Π³ΠΈ користСа Π·Π° Π΄Π° ΠΈΡΠΏΡ€Π°ΡœΠ°Π°Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈ ΠΎΠ΄ процСсори Π½Π° тСкст Π΄ΠΎ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‡ΠΎΡ‚. ΠΠ΅ΡˆΡ‚ΠΎ ΠΏΠΎΠ΄ΠΎΡ†Π½Π°, КСн Π³ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΠΎΡ‚ API ΠΈ синтаксата Π·Π° Π·Π°Π²ΠΈΡ‚ΠΊΡƒΠ²Π°ΡšΠ΅ Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Π½Π° Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ со почисти ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΠΈ ΠΊΠΎΠΈ ΠΎΡ‚Ρ‚ΠΎΠ³Π°Ρˆ сС користат.

Π—Π° ΠΆΠ°Π», ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π° Ρ‚Ρ€Π΅Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Unix ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π΅ ΠΈΠ·Π³ΡƒΠ±Π΅Π½. И ΠΈΠ°ΠΊΠΎ Π³ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ напишан Π²ΠΎ C Ρ‡Π΅Ρ‚Π²Ρ€Ρ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅, кој бСшС објавСн Π²ΠΎ Π½ΠΎΠ΅ΠΌΠ²Ρ€ΠΈ 1973 Π³ΠΎΠ΄ΠΈΠ½Π°, Π½ΠΎ ΠΈΠ·Π»Π΅Π·Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ мСсСци ΠΏΡ€Π΅Π΄ ΠΎΡ„ΠΈΡ†ΠΈΡ˜Π°Π»Π½ΠΎΡ‚ΠΎ ΠΎΠ±Ρ˜Π°Π²ΡƒΠ²Π°ΡšΠ΅ ΠΈ Π½Π΅ содрТи ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ. Π¨Ρ‚Π΅Ρ‚Π° ΡˆΡ‚ΠΎ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π° ΠΎΠ²Π°Π° Π»Π΅Π³Π΅Π½Π΄Π°Ρ€Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° Π½Π° Unix Π΅ ΠΈΠ·Π³ΡƒΠ±Π΅Π½, ΠΌΠΎΠΆΠ΅Π±ΠΈ засСкогаш.

ИмамС тСкст Π·Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π·Π° pipe(2) ΠΎΠ΄ Π΄Π²Π΅Ρ‚Π΅ изданија, ΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ со ΠΏΡ€Π΅Π±Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Ρ‚Ρ€Π΅Ρ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (Π·Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ, ΠΏΠΎΠ΄Π²Π»Π΅Ρ‡Π΅Π½ΠΎ β€žΡ€Π°Ρ‡Π½ΠΎβ€œ, Π½ΠΈΠ·Π° ΠΎΠ΄ Π±ΡƒΠΊΠ²Π°Π»Π½ΠΈ ^H прослСдСни со Π΄ΠΎΠ»Π½Π° Ρ†Ρ€Ρ‚Π°!). Овој ΠΏΡ€ΠΎΡ‚ΠΎ-pipe(2) Π΅ напишана Π²ΠΎ асСмблСр ΠΈ Π²Ρ€Π°ΡœΠ° само Π΅Π΄Π΅Π½ дСскриптор Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°, Π½ΠΎ вСќС ја ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡƒΠ²Π° ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°Π½Π°Ρ‚Π° основна функционалност:

БистСмски ΠΏΠΎΠ²ΠΈΠΊ Ρ†Π΅Π²ΠΊΠ° создава ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π²Π»Π΅Π·/ΠΈΠ·Π»Π΅Π· Π½Π°Ρ€Π΅Ρ‡Π΅Π½ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄. ΠžΠΏΠΈΡΠΎΡ‚ Π½Π° Π²Ρ€Π°Ρ‚Π΅Π½Π°Ρ‚Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС користи Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΈ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅. Кога Π½Π΅ΡˆΡ‚ΠΎ ќС сС запишС Π²ΠΎ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ‚, Ρ‚ΠΎΡ˜ Ρ‚Π°ΠΌΠΏΠΎΠ½ΠΈΡ€Π° Π΄ΠΎ 504 Π±Π°Ρ˜Ρ‚ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΏΠΎ ΡˆΡ‚ΠΎ процСсот Π½Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π΅ суспСндиран. ΠŸΡ€ΠΈ Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΎΠ΄ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ‚, сС Π·Π΅ΠΌΠ°Π°Ρ‚ Π±Π°Ρ„Π΅Ρ€ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.

Π”ΠΎ слСдната Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ бСшС ΠΏΡ€Π΅ΠΏΠΈΡˆΠ°Π½ Π²ΠΎ C, ΠΈ Ρ†Π΅Π²ΠΊΠ° (2) Π²ΠΎ Ρ‡Π΅Ρ‚Π²Ρ€Ρ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π³ΠΎ стСкна ΡΠ²ΠΎΡ˜ΠΎΡ‚ ΠΌΠΎΠ΄Π΅Ρ€Π΅Π½ ΠΈΠ·Π³Π»Π΅Π΄ со ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΡ‚ "pipe(fildes)"

БистСмски ΠΏΠΎΠ²ΠΈΠΊ Ρ†Π΅Π²ΠΊΠ° создава ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π²Π»Π΅Π·/ΠΈΠ·Π»Π΅Π· Π½Π°Ρ€Π΅Ρ‡Π΅Π½ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄. Π’Ρ€Π°Ρ‚Π΅Π½ΠΈΡ‚Π΅ дСскриптори Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС користат Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΈ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅. Кога Π½Π΅ΡˆΡ‚ΠΎ ќС сС запишС Π²ΠΎ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ‚, сС користи дСскрипторот Π²Ρ€Π°Ρ‚Π΅Π½ Π²ΠΎ r1 (односно Fildes[1]), Π·Π°Ρ‡ΡƒΠ²Π°Π½ Π΄ΠΎ 4096 Π±Π°Ρ˜Ρ‚ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΏΠΎ ΡˆΡ‚ΠΎ процСсот Π½Π° Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π΅ суспСндиран. ΠŸΡ€ΠΈ Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΎΠ΄ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ‚, дСскрипторот Π²Ρ€Π°Ρ‚Π΅Π½ Π²ΠΎ r0 (односно Fildes[0]) Π³ΠΈ Π·Π΅ΠΌΠ° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅.

Π‘Π΅ прСтпоставува Π΄Π΅ΠΊΠ° ΡˆΡ‚ΠΎΠΌ ќС сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° гасоводот, Π΄Π²Π° (ΠΈΠ»ΠΈ повСќС) ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ процСси (создадСни со послСдоватСлни ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΡšΠ° Π²ΠΈΠ»ΡƒΡˆΠΊΠ°) ќС прСнСсува ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΎΠ΄ гасоводот ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ΠΏΠΎΠ²ΠΈΡ†ΠΈ Ρ‡ΠΈΡ‚Π° ΠΈ ΠΏΠΈΡˆΡƒΠ²Π°ΠΌ.

Π¨ΠΊΠΎΠ»ΠΊΠ°Ρ‚Π° ΠΈΠΌΠ° синтакса Π·Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π»ΠΈΠ½Π΅Π°Ρ€Π½Π° Π½ΠΈΠ·Π° Π½Π° процСси ΠΏΠΎΠ²Ρ€Π·Π°Π½ΠΈ ΠΏΡ€Π΅ΠΊΡƒ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄.

ΠŸΠΎΠ²ΠΈΡ†ΠΈΡ‚Π΅ Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΎΠ΄ ΠΏΡ€Π°Π·Π΅Π½ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ (ΡˆΡ‚ΠΎ Π½Π΅ содрТи Π±Π°Ρ„Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ) кој ΠΈΠΌΠ° само Π΅Π΄Π΅Π½ ΠΊΡ€Π°Ρ˜ (ситС дСскриптори Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈ) Π²Ρ€Π°ΡœΠ°Π°Ρ‚ β€žΠΊΡ€Π°Ρ˜ Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°β€œ. ΠŸΠΎΠ²ΠΈΡ†ΠΈΡ‚Π΅ Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ слична ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π° сС ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°Π°Ρ‚.

ΠΠ°Ρ˜Ρ€Π°Π½ΠΎ Π·Π°Ρ‡ΡƒΠ²Π°Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° гасоводот сС однСсува Π΄ΠΎ ΠΏΠ΅Ρ‚Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix (Ρ˜ΡƒΠ½ΠΈ 1974), Π½ΠΎ Π΅ рСчиси ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ со оној ΡˆΡ‚ΠΎ сС појави Π²ΠΎ слСдното ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. Π”ΠΎΠ΄Π°Π΄Π΅Π½ΠΈ сС само ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΠΏΠ΅Ρ‚Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС прСскокнС.

ШСстото ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix (1975)

ΠŸΠΎΡ‡Π½ΡƒΠ²Π° Π΄Π° Π³ΠΎ Ρ‡ΠΈΡ‚Π° ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° Unix ΡˆΠ΅ΡΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (мај 1975). Π’ΠΎ Π³ΠΎΠ»Π΅ΠΌΠ° ΠΌΠ΅Ρ€Π° Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Π›Π°Π²ΠΎΠ²ΠΈ ΠΌΠ½ΠΎΠ³Ρƒ Π΅ полСсно Π΄Π° сС најдС ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Π²Π΅Ρ€Π·ΠΈΠΈ:

Π—Π° ΠΌΠ½ΠΎΠ³Ρƒ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Π›Π°Π²ΠΎΠ²ΠΈ бСшС СдинствСниот Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π½Π° Unix ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ достапСн Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ Bell Labs. Иако Π»ΠΈΡ†Π΅Π½Ρ†Π°Ρ‚Π° Π·Π° ΡˆΠ΅ΡΡ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠΌ Π΄ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π°ΡˆΠ΅ Π½Π° наставницитС Π΄Π° Π³ΠΎ користат Π½Π΅Ρ˜Π·ΠΈΠ½ΠΈΠΎΡ‚ ΠΈΠ·Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄, Π»ΠΈΡ†Π΅Π½Ρ†Π°Ρ‚Π° Π·Π° сСдмото ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ја исклучи ΠΎΠ²Π°Π° моТност, ΠΏΠ° ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° бСшС дистрибуирана Π²ΠΎ Π½Π΅Π»Π΅Π³Π°Π»Π½ΠΈ ΠΊΠΎΠΏΠΈΠΈ Π½Π° машина.

ДСнСс ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΡƒΠΏΠΈΡ‚Π΅ ΠΏΡ€Π΅ΠΏΠ΅Ρ‡Π°Ρ‚Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ ΠΎΠ΄ ΠΊΠ½ΠΈΠ³Π°Ρ‚Π°, Ρ‡ΠΈΡ˜Π° ΠΊΠΎΡ€ΠΈΡ†Π° Π³ΠΈ ΠΏΡ€ΠΈΠΊΠ°ΠΆΡƒΠ²Π° студСнтитС Π½Π° ΠΊΠΎΠΏΠΈΡ€. И Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Π’ΠΎΡ€Π΅Π½ Π’ΠΎΠΌΠΈ (кој Π³ΠΎ Π·Π°ΠΏΠΎΡ‡Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚ TUHS), ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€Π΅Π·Π΅ΠΌΠ΅Ρ‚Π΅ ШСстото ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π˜Π·Π²ΠΎΡ€ PDF. Π‘Π°ΠΊΠ°ΠΌ Π΄Π° Π²ΠΈ Π΄Π°Π΄Π°ΠΌ идСја Π·Π° Ρ‚ΠΎΠ° ΠΊΠΎΠ»ΠΊΡƒ Π½Π°ΠΏΠΎΡ€ сС Π²Π»ΠΎΠΆΠΈ Π²ΠΎ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°:

ΠŸΡ€Π΅Π΄ повСќС ΠΎΠ΄ 15 Π³ΠΎΠ΄ΠΈΠ½ΠΈ, напишав копија ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π°Π²Π΅Π΄Π΅Π½ Π²ΠΎ Π›Π°Π²ΠΎΠ²ΠΈΠ·Π°Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Π½Π΅ ΠΌΠΈ сС Π΄ΠΎΠΏΠ°Π΄Π½Π° ΠΊΠ²Π°Π»ΠΈΡ‚Π΅Ρ‚ΠΎΡ‚ Π½Π° ΠΌΠΎΡ˜Π°Ρ‚Π° копија ΠΎΠ΄ Π½Π΅ΠΏΠΎΠ·Π½Π°Ρ‚ Π±Ρ€ΠΎΡ˜ Π΄Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΏΠΈΠΈ. TUHS сè ΡƒΡˆΡ‚Π΅ Π½Π΅ ΠΏΠΎΡΡ‚ΠΎΠ΅ΡˆΠ΅, Π° јас Π½Π΅ΠΌΠ°Π² пристап Π΄ΠΎ старитС ΠΈΠ·Π²ΠΎΡ€ΠΈ. Но, Π²ΠΎ 1988 Π³ΠΎΠ΄ΠΈΠ½Π° најдов стара Π»Π΅Π½Ρ‚Π° со 9 пСсни Π½Π° ΠΊΠΎΠΈ ΠΈΠΌΠ°Π»ΠΎ Ρ€Π΅Π·Π΅Ρ€Π²Π½Π° копија ΠΎΠ΄ ΠΊΠΎΠΌΠΏΡ˜ΡƒΡ‚Π΅Ρ€ PDP11. ВСшко бСшС Π΄Π° сС Π·Π½Π°Π΅ Π΄Π°Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π½ΠΎ имашС Π½Π΅Π΄ΠΎΠΏΡ€Π΅Π½ΠΎ Π΄Ρ€Π²ΠΎ /usr/src/ Π²ΠΎ ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅ΡœΠ΅Ρ‚ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ Π±Π΅Π° ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈ 1979 Π³ΠΎΠ΄ΠΈΠ½Π°, ΡˆΡ‚ΠΎ Π΄ΡƒΡ€ΠΈ ΠΈ Ρ‚ΠΎΠ³Π°Ρˆ изглСдашС Π°Π½Ρ‚ΠΈΡ‡ΠΊΠΎ. Π’ΠΎΠ° бСшС сСдмото ΠΈΠ·Π΄Π°Π½ΠΈΠ΅, ΠΈΠ»ΠΈ Π΄Π΅Ρ€ΠΈΠ²Π°Ρ‚ Π½Π° PWB, си помислив.

Π“ΠΎ Π·Π΅Π΄ΠΎΠ² Π½Π°ΠΎΠ΄ΠΎΡ‚ ΠΊΠ°ΠΊΠΎ основа ΠΈ Ρ€Π°Ρ‡Π½ΠΎ Π³ΠΈ ΡƒΡ€Π΅Π΄ΠΈΠ² ΠΈΠ·Π²ΠΎΡ€ΠΈΡ‚Π΅ Π΄ΠΎ ΡΠΎΡΡ‚ΠΎΡ˜Π±Π°Ρ‚Π° Π½Π° ΡˆΠ΅ΡΡ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. Π”Π΅Π» ΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΡ‚ остана ист, Π΄Π΅Π» ΠΌΠΎΡ€Π°ΡˆΠ΅ ΠΌΠ°Π»ΠΊΡƒ Π΄Π° сС ΡƒΡ€Π΅Π΄ΠΈ, ΠΌΠ΅Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΎ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠΎΡ‚ Ρ‚ΠΎΠΊΠ΅Π½ += Π²ΠΎ застарСн =+. ΠΠ΅ΡˆΡ‚ΠΎ Сдноставно бСшС ΠΈΠ·Π±Ρ€ΠΈΡˆΠ°Π½ΠΎ, ΠΈ Π½Π΅ΡˆΡ‚ΠΎ Ρ‚Ρ€Π΅Π±Π°ΡˆΠ΅ цСлосно Π΄Π° сС ΠΏΡ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π½ΠΎ Π½Π΅ ΠΏΡ€Π΅ΠΌΠ½ΠΎΠ³Ρƒ.

И дСнСс ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΌΠ΅ онлајн Π½Π° TUHS ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° ΡˆΠ΅ΡΡ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π°, Π²ΠΎ која имашС Ρ€Π°ΠΊΠ° ДСнис Π ΠΈΡ‡ΠΈ.

ΠŸΠ°Ρ‚Π΅ΠΌ, Π½Π° ΠΏΡ€Π² ΠΏΠΎΠ³Π»Π΅Π΄, Π³Π»Π°Π²Π½Π°Ρ‚Π° карактСристика Π½Π° Π¦-ΠΊΠΎΠ΄ΠΎΡ‚ ΠΏΡ€Π΅Π΄ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΎΡ‚ Π½Π° ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½ ΠΈ Π ΠΈΡ‡ΠΈ Π΅ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° краткост. НС сС случува чСсто Π΄Π° ΠΌΠΎΠΆΠ°ΠΌ Π΄Π° Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈ ΠΎΠ΄ ΠΊΠΎΠ΄ Π±Π΅Π· ΠΎΠΏΡˆΠΈΡ€Π½ΠΎ ΡƒΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π·Π° Π΄Π° ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°ΠΌ Π½Π° Ρ€Π΅Π»Π°Ρ‚ΠΈΠ²Π½ΠΎ тСсна област Π·Π° ΠΏΡ€ΠΈΠΊΠ°ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΌΠΎΡ˜Π°Ρ‚Π° страница.

ΠŸΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ /usr/sys/ken/pipe.c ΠΈΠΌΠ° ΠΎΠ±Ρ˜Π°ΡΠ½ΡƒΠ²Π°Ρ‡ΠΊΠΈ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ (ΠΈ Π΄Π°, ΠΈΠΌΠ° повСќС /usr/sys/dmr):

/*
 * Max allowable buffering per pipe.
 * This is also the max size of the
 * file created to implement the pipe.
 * If this size is bigger than 4096,
 * pipes will be implemented in LARG
 * files, which is probably not good.
 */
#define    PIPSIZ    4096

Π“ΠΎΠ»Π΅ΠΌΠΈΠ½Π°Ρ‚Π° Π½Π° Π±Π°Ρ„Π΅Ρ€ΠΎΡ‚ Π½Π΅ Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Ρ‚Π° ΠΎΠ΄ Ρ‡Π΅Ρ‚Π²Ρ€Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. Но, ΠΎΠ²Π΄Π΅ Π³Π»Π΅Π΄Π°ΠΌΠ΅, Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²Π° јавна Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°, Π΄Π΅ΠΊΠ° Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ нСкогаш користСлС Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΊΠ°ΠΊΠΎ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅!

Π¨Ρ‚ΠΎ сС однСсува Π΄ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ LARG, Ρ‚ΠΈΠ΅ ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Π°Ρ‚ Π½Π° inode-Π·Π½Π°ΠΌΠ΅ LARG, ΡˆΡ‚ΠΎ сС користи ΠΎΠ΄ β€žΠ³ΠΎΠ»Π΅ΠΌΠΈΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ Π·Π° Π°Π΄Ρ€Π΅ΡΠΈΡ€Π°ΡšΠ΅β€œ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΠ½Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π·Π° ΠΏΠΎΠ΄Π΄Ρ€ΡˆΠΊΠ° Π½Π° ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌΠΈ Π΄Π°Ρ‚ΠΎΡ‚Π΅Ρ‡Π½ΠΈ систСми. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ КСн Ρ€Π΅Ρ‡Π΅ Π΄Π΅ΠΊΠ° Π΅ ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΄Π° Π½Π΅ Π³ΠΈ користимС, Ρ‚ΠΎΠ³Π°Ρˆ со задоволство ќС Π³ΠΎ Π·Π΅ΠΌΠ°ΠΌ Π·Π±ΠΎΡ€ΠΎΡ‚ Π·Π° Ρ‚ΠΎΠ°.

Π•Π²Π΅ Π³ΠΎ вистинскиот систСмски ΠΏΠΎΠ²ΠΈΠΊ pipe:

/*
 * The sys-pipe entry.
 * Allocate an inode on the root device.
 * Allocate 2 file structures.
 * Put it all together with flags.
 */
pipe()
{
    register *ip, *rf, *wf;
    int r;

    ip = ialloc(rootdev);
    if(ip == NULL)
        return;
    rf = falloc();
    if(rf == NULL) {
        iput(ip);
        return;
    }
    r = u.u_ar0[R0];
    wf = falloc();
    if(wf == NULL) {
        rf->f_count = 0;
        u.u_ofile[r] = NULL;
        iput(ip);
        return;
    }
    u.u_ar0[R1] = u.u_ar0[R0]; /* wf's fd */
    u.u_ar0[R0] = r;           /* rf's fd */
    wf->f_flag = FWRITE|FPIPE;
    wf->f_inode = ip;
    rf->f_flag = FREAD|FPIPE;
    rf->f_inode = ip;
    ip->i_count = 2;
    ip->i_flag = IACC|IUPD;
    ip->i_mode = IALLOC;
}

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΎΡ‚ јасно ΠΎΠΏΠΈΡˆΡƒΠ²Π° ΡˆΡ‚ΠΎ сС случува ΠΎΠ²Π΄Π΅. Но, Π½Π΅ Π΅ Ρ‚ΠΎΠ»ΠΊΡƒ лСсно Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π΅ ΠΊΠΎΠ΄ΠΎΡ‚, Π΄Π΅Π»ΡƒΠΌΠ½ΠΎ ΠΏΠΎΡ€Π°Π΄ΠΈ Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ "struct user uΒ» ΠΈ сС Π·Π°ΠΏΠΈΡˆΡƒΠ²Π° R0 ΠΈ R1 сС прСнСсуваат ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π° систСмскиот ΠΏΠΎΠ²ΠΈΠΊ ΠΈ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½ΠΈΡ‚Π΅ врСдности.

АјдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ со ialloc() мСсто Π½Π° дискот ΠΈΠ½ΠΎΠ΄Π° (ΠΈΠ½ΠΎΠ΄Π°), ΠΈ со помош falloc () - ΠΏΡ€ΠΎΠ΄Π°Π²Π½ΠΈΡ†Π° Π΄Π²Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°. Ако сС ΠΎΠ΄ΠΈ Π΄ΠΎΠ±Ρ€ΠΎ, ќС поставимС Π·Π½Π°ΠΌΠ΅Π½Ρ†Π° Π·Π° Π΄Π° Π³ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΠ²Π°ΠΌΠ΅ ΠΎΠ²ΠΈΠ΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΊΠ°ΠΊΠΎ Π΄Π²Π°Ρ‚Π° ΠΊΡ€Π°Ρ˜Π° Π½Π° гасоводот, ќС Π³ΠΈ насочимС ΠΊΠΎΠ½ истата ΠΈΠ½ΠΎΠ΄Π° (Ρ‡ΠΈΡ˜ Π±Ρ€ΠΎΡ˜ Π½Π° Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈ станува 2) ΠΈ ќС ја ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌΠ΅ ΠΈΠ½ΠΎΠ΄Π°Ρ‚Π° ΠΊΠ°ΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Ρ‚Π° ΠΈ Π²ΠΎ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°. ΠžΠ±Ρ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π±Π°Ρ€Π°ΡšΠ°Ρ‚Π° Π·Π° ставам() Π²ΠΎ ΠΏΠ°Ρ‚Π΅ΠΊΠΈΡ‚Π΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π·Π° Π΄Π° сС Π½Π°ΠΌΠ°Π»ΠΈ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈ Π²ΠΎ Π½ΠΎΠ²Π°Ρ‚Π° ΠΈΠ½ΠΎΠ΄Π°.

pipe() сС Π΄ΠΎΠ»ΠΆΠΈ ΠΏΡ€Π΅ΠΊΡƒ R0 ΠΈ R1 Π²Ρ€Π°Ρ‚Π΅Ρ‚Π΅ Π³ΠΈ Π±Ρ€ΠΎΠ΅Π²ΠΈΡ‚Π΅ Π½Π° дСскрипторот Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅ Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΈ ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅. falloc() Π²Ρ€Π°ΡœΠ° ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ Π²ΠΎ структура Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°, Π½ΠΎ ΠΈ β€žΠ²Ρ€Π°ΡœΠ°β€œ ΠΏΡ€Π΅ΠΊΡƒ u.u_ar0[R0] ΠΈ дСскриптор Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°. Π’ΠΎΠ° Π΅, ΠΊΠΎΠ΄ΠΎΡ‚ Π΅ Π·Π°Ρ‡ΡƒΠ²Π°Π½ Π²ΠΎ r дСскриптор Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΈ Π΄ΠΎΠ΄Π΅Π»ΡƒΠ²Π° дСскриптор Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ΄ u.u_ar0[R0] ΠΏΠΎ Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ ΠΏΠΎΠ²ΠΈΠΊ falloc().

Π—Π½Π°ΠΌΠ΅ FPIPE, ΡˆΡ‚ΠΎ Π³ΠΎ поставивмС ΠΏΡ€ΠΈ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° гасоводот, Π³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π° ΠΎΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° rdwr() Π²ΠΎ sys2.c, кој ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° спСцифични I/O Ρ€ΡƒΡ‚ΠΈΠ½ΠΈ:

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

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

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

ΠŸΠΎΡ‚ΠΎΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° readp() Π² pipe.c Π³ΠΈ Ρ‡ΠΈΡ‚Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΎΠ΄ гасоводот. Но, ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΅ Π΄Π° сС слСди ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΏΠΎΡ‡Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ ΠΎΠ΄ writep(). ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, ΠΊΠΎΠ΄ΠΎΡ‚ стана ΠΏΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Π½ ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π°Ρ‚Π° Π½Π° ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΡ˜Π°Ρ‚Π° Π·Π° Π΄ΠΎΠ½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ, Π½ΠΎ Π½Π΅ΠΊΠΎΠΈ Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΡΠΏΡƒΡˆΡ‚Π°Ρ‚.

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

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

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

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

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

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

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

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

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

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

Π‘Π°ΠΊΠ°ΠΌΠ΅ Π΄Π° напишСмС Π±Π°Ρ˜Ρ‚ΠΈ Π½Π° Π²Π»Π΅Π·ΠΎΡ‚ Π½Π° гасоводот u.u_count. ΠŸΡ€Π²ΠΎ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја Π·Π°ΠΊΠ»ΡƒΡ‡ΠΈΠΌΠ΅ ΠΈΠ½ΠΎΠ΄Π°Ρ‚Π° (Π²ΠΈΠ΄ΠΈ ΠΏΠΎΠ΄ΠΎΠ»Ρƒ plock/prele).

ΠŸΠΎΡ‚ΠΎΠ° Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡƒΠ²Π°ΠΌΠ΅ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈ Π½Π° ΠΈΠ½ΠΎΠ΄Π°. Π‘Γ¨ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π΄Π²Π°Ρ‚Π° ΠΊΡ€Π°Ρ˜Π° Π½Π° Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ‚ останат ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈ, Π±Ρ€ΠΎΡ˜Π°Ρ‡ΠΎΡ‚ Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π±ΠΈΠ΄Π΅ 2. Π‘Π΅ Π΄Ρ€ΠΆΠΈΠΌΠ΅ Π·Π° Π΅Π΄Π½Π° врска (ΠΎΠ΄ rp->f_inode), ΠΏΠ° Π°ΠΊΠΎ Π±Ρ€ΠΎΡ˜Π°Ρ‡ΠΎΡ‚ Π΅ ΠΏΠΎΠΌΠ°Π» ΠΎΠ΄ 2, Ρ‚ΠΎΠ³Π°Ρˆ Ρ‚ΠΎΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° процСсот Π½Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ Π³ΠΎ Π·Π°Ρ‚Π²ΠΎΡ€ΠΈΠ» ΡΠ²ΠΎΡ˜ΠΎΡ‚ ΠΊΡ€Π°Ρ˜ Π½Π° гасоводот. Π‘ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ, сС ΠΎΠ±ΠΈΠ΄ΡƒΠ²Π°ΠΌΠ΅ Π΄Π° пишСмС Π½Π° Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ гасовод, ΡˆΡ‚ΠΎ Π΅ Π³Ρ€Π΅ΡˆΠΊΠ°. ΠŸΡ€Π²ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ° EPIPE ΠΈ сигнал SIGPIPE сС појави Π²ΠΎ ΡˆΠ΅ΡΡ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix.

Но, Π΄ΡƒΡ€ΠΈ ΠΈ Π°ΠΊΠΎ транспортСрот Π΅ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½, ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΏΠΎΠ»Π½. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, ја ослободувамС Π±Ρ€Π°Π²Π°Ρ‚Π° ΠΈ ΠΎΠ΄ΠΈΠΌΠ΅ Π΄Π° спиСмС со Π½Π°Π΄Π΅ΠΆ Π΄Π΅ΠΊΠ° Π΄Ρ€ΡƒΠ³ процСс ќС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π° ΠΎΠ΄ гасоводот ΠΈ ќС ослободи Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ простор Π²ΠΎ Π½Π΅Π³ΠΎ. Кога ќС сС Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΠΌΠ΅, сС Π²Ρ€Π°ΡœΠ°ΠΌΠ΅ Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ја Π·Π°ΠΊΠ°Ρ‡ΡƒΠ²Π°ΠΌΠ΅ Π±Ρ€Π°Π²Π°Ρ‚Π° ΠΈ Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π°ΠΌΠ΅ Π½ΠΎΠ² циклус Π½Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅.

Ако ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ слободСн простор Π²ΠΎ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ‚, Ρ‚ΠΎΠ³Π°Ρˆ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π½Π° Π½Π΅Π³ΠΎ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ writei (). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π°Ρ€ i_size1 inode'a (со ΠΏΡ€Π°Π·Π΅Π½ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ Π΅Π΄Π½Π°ΠΊΠΎΠ² Π½Π° 0) ΡƒΠΊΠ°ΠΆΡƒΠ²Π° Π½Π° ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ вСќС Π³ΠΈ содрТи. Ако ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ простор Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΏΠΎΠΏΠΎΠ»Π½ΠΈΠΌΠ΅ гасоводот ΠΎΠ΄ i_size1 Π΄Π° PIPESIZ. ΠŸΠΎΡ‚ΠΎΠ° ја ослободувамС Π±Ρ€Π°Π²Π°Ρ‚Π° ΠΈ сС ΠΎΠ±ΠΈΠ΄ΡƒΠ²Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΠΌΠ΅ сСкој процСс ΡˆΡ‚ΠΎ Ρ‡Π΅ΠΊΠ° Π΄Π° сС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π° ΠΎΠ΄ гасоводот. Π‘Π΅ Π²Ρ€Π°ΡœΠ°ΠΌΠ΅ Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π΄Π°Π»ΠΈ успСавмС Π΄Π° напишСмС ΠΎΠ½ΠΎΠ»ΠΊΡƒ Π±Π°Ρ˜Ρ‚ΠΈ ΠΊΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ Π½ΠΈ Ρ‚Ρ€Π΅Π±Π°Π°. Ако Π½Π΅, Ρ‚ΠΎΠ³Π°Ρˆ Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π°ΠΌΠ΅ Π½ΠΎΠ² циклус Π½Π° снимањС.

ΠžΠ±ΠΈΡ‡Π½ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π°Ρ€ i_mode inode сС користи Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ r, w ΠΈ x. Но, Π²ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ, сигнализирамС Π΄Π΅ΠΊΠ° нСкој процСс Ρ‡Π΅ΠΊΠ° Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ ΠΈΠ»ΠΈ Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π±ΠΈΡ‚ΠΎΠ²ΠΈ IREAD ΠΈ IWRITE соодвСтно. ΠŸΡ€ΠΎΡ†Π΅ΡΠΎΡ‚ Π³ΠΎ поставува Π·Π½Π°ΠΌΠ΅Ρ‚ΠΎ ΠΈ ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° sleep(), Π° сС ΠΎΡ‡Π΅ΠΊΡƒΠ²Π° Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π° Π΄Π° ΠΏΠΎΠ²ΠΈΠΊΠ° нСкој Π΄Ρ€ΡƒΠ³ процСс wakeup().

Вистинската магија сС случува Π²ΠΎ sleep() ΠΈ wakeup(). Π’ΠΈΠ΅ сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ΠΈ Π²ΠΎ slp.c, ΠΈΠ·Π²ΠΎΡ€ΠΎΡ‚ Π½Π° ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈΠΎΡ‚ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ β€žΠžΠ²Π° Π½Π΅ сС ΠΎΡ‡Π΅ΠΊΡƒΠ²Π° Π΄Π° Π³ΠΎ Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅β€œ. Π—Π° ΡΡ€Π΅ΡœΠ°, Π½Π΅ ΠΌΠΎΡ€Π° Π΄Π° Π³ΠΎ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌΠ΅ ΠΊΠΎΠ΄ΠΎΡ‚, само ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ:

/*
 * Give up the processor till a wakeup occurs
 * on chan, at which time the process
 * enters the scheduling queue at priority pri.
 * The most important effect of pri is that when
 * pri<0 a signal cannot disturb the sleep;
 * if pri>=0 signals will be processed.
 * Callers of this routine must be prepared for
 * premature return, and check that the reason for
 * sleeping has gone away.
 */
sleep(chan, pri) /* … */

/*
 * Wake up all processes sleeping on chan.
 */
wakeup(chan) /* … */

ΠŸΡ€ΠΎΡ†Π΅ΡΠΎΡ‚ кој ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° sleep() Π·Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ ΠΊΠ°Π½Π°Π», ΠΏΠΎΠ΄ΠΎΡ†Π½Π° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Ρ€Π°Π·Π±ΡƒΠ΄ΠΈ ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ процСс, кој ќС сС јави wakeup() Π·Π° истиот ΠΊΠ°Π½Π°Π». writep() ΠΈ readp() Π³ΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½ΠΈΡ€Π°Π°Ρ‚ своитС активности ΠΏΡ€Π΅ΠΊΡƒ Ρ‚Π°ΠΊΠ²ΠΈ спарСни ΠΏΠΎΠ²ΠΈΡ†ΠΈ. Π—Π°Π±Π΅Π»Π΅ΠΆΠΈ Π³ΠΎ Ρ‚ΠΎΠ° pipe.c сСкогаш Π΄Π°Π²Π°Ρ˜Ρ‚Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ PPIPE ΠΊΠΎΠ³Π° ќС сС ΠΏΠΎΠ²ΠΈΠΊΠ°Π°Ρ‚ sleep(), ΠΏΠ° ситС sleep() ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€Π΅ΠΊΠΈΠ½Π΅ со сигнал.

Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ сè Π·Π° Π΄Π° ја Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° readp():

readp(fp)
int *fp;
{
    register *rp, *ip;

    rp = fp;
    ip = rp->f_inode;

loop:
    /* Very conservative locking. */

    plock(ip);

    /*
     * If the head (read) has caught up with
     * the tail (write), reset both to 0.
     */

    if(rp->f_offset[1] == ip->i_size1) {
        if(rp->f_offset[1] != 0) {
            rp->f_offset[1] = 0;
            ip->i_size1 = 0;
            if(ip->i_mode&IWRITE) {
                ip->i_mode =& ~IWRITE;
                wakeup(ip+1);
            }
        }

        /*
         * If there are not both reader and
         * writer active, return without
         * satisfying read.
         */

        prele(ip);
        if(ip->i_count < 2)
            return;
        ip->i_mode =| IREAD;
        sleep(ip+2, PPIPE);
        goto loop;
    }

    /* Read and return */

    u.u_offset[0] = 0;
    u.u_offset[1] = rp->f_offset[1];
    readi(ip);
    rp->f_offset[1] = u.u_offset[1];
    prele(ip);
}

МоТСби ќС Π²ΠΈ Π±ΠΈΠ΄Π΅ полСсно Π΄Π° ја Ρ‡ΠΈΡ‚Π°Ρ‚Π΅ ΠΎΠ²Π°Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° ΠΎΠ΄ Π΄Π½ΠΎΡ‚ΠΎ ΠΊΠΎΠ½ Π²Ρ€Π²ΠΎΡ‚. Π“Ρ€Π°Π½ΠΊΠ°Ρ‚Π° β€žΡ‡ΠΈΡ‚Π°Ρ˜ ΠΈ Π²Ρ€Π°Ρ‚ΠΈβ€œ ΠΎΠ±ΠΈΡ‡Π½ΠΎ сС користи ΠΊΠΎΠ³Π° ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π²ΠΎ Π½Π°Ρ„Ρ‚ΠΎΠ²ΠΎΠ΄ΠΎΡ‚. Π’ΠΎ овој ΡΠ»ΡƒΡ‡Π°Ρ˜, Π½ΠΈΠ΅ користимС Ρ‡ΠΈΡ‚Π°Ρ˜ () Ρ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅ ΠΎΠ½ΠΎΠ»ΠΊΡƒ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΊΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ сС достапни ΠΏΠΎΡ‡Π½ΡƒΠ²Π°Ρ˜ΡœΠΈ ΠΎΠ΄ ΡΠ΅Π³Π°ΡˆΠ½ΠΈΠΎΡ‚ f_offset ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅, Π° ΠΏΠΎΡ‚ΠΎΠ° Π°ΠΆΡƒΡ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ја врСдноста Π½Π° соодвСтното ΠΏΠΎΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅.

ΠŸΡ€ΠΈ послСдоватСлни ΠΎΡ‚Ρ‡ΠΈΡ‚ΡƒΠ²Π°ΡšΠ°, Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΎΡ‚ ќС Π±ΠΈΠ΄Π΅ ΠΏΡ€Π°Π·Π΅Π½ Π°ΠΊΠΎ Π΅ достигнато ΠΏΠΎΠΌΠ΅ΡΡ‚ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ i_size1 Π½Π° ΠΈΠ½ΠΎΠ΄Π°Ρ‚Π°. Ја рСсСтирамС ΠΏΠΎΠ·ΠΈΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° 0 ΠΈ сС ΠΎΠ±ΠΈΠ΄ΡƒΠ²Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΠΌΠ΅ сСкој процСс ΡˆΡ‚ΠΎ сака Π΄Π° запишС Π½Π° гасоводот. Π—Π½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΊΠΎΠ³Π° транспортСрот Π΅ ΠΏΠΎΠ»Π½, writep() заспива Π½Π° ip+1. И сСга ΠΊΠΎΠ³Π° гасоводот Π΅ ΠΏΡ€Π°Π·Π΅Π½, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΠΌΠ΅ Π·Π° Π΄Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈ со циклусот Π½Π° Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅.

Ако Π½Π΅ΠΌΠ° ΡˆΡ‚ΠΎ Π΄Π° сС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°, Ρ‚ΠΎΠ³Π°Ρˆ readp() ΠΌΠΎΠΆΠ΅ Π΄Π° постави Π·Π½Π°ΠΌΠ΅ IREAD ΠΈ заспиС Π½Π° ip+2. Π—Π½Π°Π΅ΠΌΠ΅ ΡˆΡ‚ΠΎ ќС Π³ΠΎ Ρ€Π°Π·Π±ΡƒΠ΄ΠΈ writep()ΠΊΠΎΠ³Π° ќС запишС Π½Π΅ΠΊΠΎΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π½Π° гасоводот.

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ Π½Π° read() ΠΈ writei() ќС Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π΅ΠΊΠ° намСсто Π΄Π° Π³ΠΈ прСнСсуватС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½ΠΈΠ· "uΒ» ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ ΠΎΠ±ΠΈΡ‡Π½ΠΈ I/O Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎΠΈ Π·Π΅ΠΌΠ°Π°Ρ‚ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°, ΠΏΠΎΠ·ΠΈΡ†ΠΈΡ˜Π°, Π±Π°Ρ„Π΅Ρ€ Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° ΠΈ Π³ΠΎ Π±Ρ€ΠΎΡ˜Π°Ρ‚ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° Π±Π°Ρ˜Ρ‚ΠΈ Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΈΠ»ΠΈ ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅.

/*
 * Read the file corresponding to
 * the inode pointed at by the argument.
 * The actual read arguments are found
 * in the variables:
 *    u_base        core address for destination
 *    u_offset    byte offset in file
 *    u_count        number of bytes to read
 *    u_segflg    read to kernel/user
 */
readi(aip)
struct inode *aip;
/* … */

/*
 * Write the file corresponding to
 * the inode pointed at by the argument.
 * The actual write arguments are found
 * in the variables:
 *    u_base        core address for source
 *    u_offset    byte offset in file
 *    u_count        number of bytes to write
 *    u_segflg    write to kernel/user
 */
writei(aip)
struct inode *aip;
/* … */

Π¨Ρ‚ΠΎ сС однСсува Π΄ΠΎ β€žΠΊΠΎΠ½Π·Π΅Ρ€Π²Π°Ρ‚ΠΈΠ²Π½ΠΎβ€œ Π±Π»ΠΎΠΊΠΈΡ€Π°ΡšΠ΅, Ρ‚ΠΎΠ³Π°Ρˆ readp() ΠΈ writep() Π·Π°ΠΊΠ»ΡƒΡ‡Π΅Ρ‚Π΅ Π³ΠΈ ΠΈΠ½ΠΎΠ΄ΠΈΡ‚Π΅ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ Π·Π°Π²Ρ€ΡˆΠ°Ρ‚ ΠΈΠ»ΠΈ Π½Π΅ Π΄ΠΎΠ±ΠΈΡ˜Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ (Ρ‚.Π΅. ΠΏΠΎΠ²ΠΈΠΊΠ°Ρ˜Ρ‚Π΅ wakeup). plock() ΠΈ prele() Π Π°Π±ΠΎΡ‚Π΅Ρ‚Π΅ Сдноставно: ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ сСт Π½Π° ΠΏΠΎΠ²ΠΈΡ†ΠΈ sleep ΠΈ wakeup Π΄ΠΎΠ·Π²ΠΎΠ»Π΅Ρ‚Π΅ Π½ΠΈ Π΄Π° Π³ΠΎ Ρ€Π°Π·Π±ΡƒΠ΄ΠΈΠΌΠ΅ сСкој процСс Π½Π° кој ΠΌΡƒ Ρ‚Ρ€Π΅Π±Π° Π±Ρ€Π°Π²Π°Ρ‚Π° ΡˆΡ‚ΠΎ ΡˆΡ‚ΠΎΡ‚ΡƒΠΊΡƒ ја ослободивмС:

/*
 * Lock a pipe.
 * If its already locked, set the WANT bit and sleep.
 */
plock(ip)
int *ip;
{
    register *rp;

    rp = ip;
    while(rp->i_flag&ILOCK) {
        rp->i_flag =| IWANT;
        sleep(rp, PPIPE);
    }
    rp->i_flag =| ILOCK;
}

/*
 * Unlock a pipe.
 * If WANT bit is on, wakeup.
 * This routine is also used to unlock inodes in general.
 */
prele(ip)
int *ip;
{
    register *rp;

    rp = ip;
    rp->i_flag =& ~ILOCK;
    if(rp->i_flag&IWANT) {
        rp->i_flag =& ~IWANT;
        wakeup(rp);
    }
}

ΠžΡ‚ΠΏΡ€Π²ΠΈΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Π² Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π°ΠΌ Π·ΠΎΡˆΡ‚ΠΎ readp() Π½Π΅ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΡƒΠ²Π° prele(ip) ΠΏΡ€Π΅Π΄ ΠΏΠΎΠ²ΠΈΠΊΠΎΡ‚ wakeup(ip+1). ΠŸΡ€Π²Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° writep() ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π²ΠΎ ΡΠ²ΠΎΡ˜Π°Ρ‚Π° јамка, ΠΎΠ²Π° plock(ip), ΡˆΡ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚ΠΈΡ€Π° со ΡœΠΎΡ€-сокак Π°ΠΊΠΎ readp() сè ΡƒΡˆΡ‚Π΅ Π½Π΅ Π³ΠΎ отстранил ΡΠ²ΠΎΡ˜ΠΎΡ‚ Π±Π»ΠΎΠΊ, ΠΏΠ° ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π΅ΠΊΠ°ΠΊΠΎ ΠΌΠΎΡ€Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ. Ако ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ Π²ΠΎ wakeup(), станува јасно Π΄Π΅ΠΊΠ° само Π³ΠΎ ΠΎΠ·Π½Π°Ρ‡ΡƒΠ²Π° процСсот Π½Π° спиСњС ΠΊΠ°ΠΊΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π²ΠΎ ΠΈΠ΄Π½ΠΈΠ½Π° sched() навистина Π³ΠΎ Π»Π°Π½ΡΠΈΡ€Π°ΡˆΠ΅. Π—Π½Π°Ρ‡ΠΈ readp() ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ wakeup(), ΠΎΡ‚ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°, поставува IREAD ΠΈ ΠΏΠΎΠ²ΠΈΡ†ΠΈ sleep(ip+2)- сСто ΠΎΠ²Π° ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ writep() Π³ΠΎ рСстартира циклусот.

Ова Π³ΠΎ ΠΊΠΎΠΌΠΏΠ»Π΅Ρ‚ΠΈΡ€Π° описот Π½Π° Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ Π²ΠΎ ΡˆΠ΅ΡΡ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. ЕдноставСн ΠΊΠΎΠ΄, далСкусСТни ΠΈΠΌΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Π‘Π΅Π΄ΠΌΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Unix (Ρ˜Π°Π½ΡƒΠ°Ρ€ΠΈ 1979) бСшС Π½ΠΎΠ²ΠΎ Π³ΠΎΠ»Π΅ΠΌΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΏΠΎΠ΄ΠΎΡ†Π½Π°) ΠΊΠΎΠ΅ Π²ΠΎΠ²Π΅Π΄Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Π½ΠΎΠ²ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ карактСристики Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ. Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, ΠΏΡ€Π΅Ρ‚Ρ€ΠΏΠ΅ Π·Π½Π°Ρ‡Π°Ρ˜Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ врска со ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° Π½Π° типско лССњС, синдикати ΠΈ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ΠΈ Π½Π° структури. Π‘Π΅ΠΏΠ°ΠΊ ΠΊΠΎΠ΄ Π·Π° Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½ΠΎ Π½Π΅ сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ. МоТСмС Π΄Π° Π³ΠΎ прСскокнСмС ΠΎΠ²Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅.

Xv6, Сдноставно Ρ˜Π°Π΄Ρ€ΠΎ слично Π½Π° Unix

Π”Π° сС ​​создадС Ρ˜Π°Π΄Ρ€ΠΎ Xv6 ΠΏΠΎΠ΄ влијаниС Π½Π° ΡˆΠ΅ΡΡ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix, Π½ΠΎ напишано Π²ΠΎ ΠΌΠΎΠ΄Π΅Ρ€Π½Π° C Π·Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° x86 процСсори. ΠšΠΎΠ΄ΠΎΡ‚ Π΅ лСсСн Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π»ΠΈΠ². Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, Π·Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΠ΄ ΠΈΠ·Π²ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° Unix со TUHS, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Ρ‚Π΅, Π΄Π° Π³ΠΎ ΠΌΠ΅Π½ΡƒΠ²Π°Ρ‚Π΅ ΠΈ Π΄Π° Π³ΠΎ стартуватС Π½Π° Π½Π΅ΡˆΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ освСн PDP 11/70. Π—Π°Ρ‚ΠΎΠ°, ΠΎΠ²Π° Ρ˜Π°Π΄Ρ€ΠΎ Π½Π°ΡˆΠΈΡ€ΠΎΠΊΠΎ сС користи Π½Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€Π·ΠΈΡ‚Π΅Ρ‚ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎ наставСн ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π» Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΡ‚Π΅ систСми. Π˜Π·Π²ΠΎΡ€ΠΈ сС Π½Π° Github.

ΠšΠΎΠ΄ΠΎΡ‚ содрТи јасна ΠΈ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Ρ†Π΅Π²ΠΊΠ°.Π², ΠΏΠΎΠ΄Π΄Ρ€ΠΆΠ°Π½ ΠΎΠ΄ Π±Π°Ρ„Π΅Ρ€ Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° намСсто ΠΈΠ½ΠΎΠ΄Π° Π½Π° дискот. ОвдС Π΄Π°Π²Π°ΠΌ само Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π° Π·Π° β€žΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π΅Π½ Π³Π°ΡΠΎΠ²ΠΎΠ΄β€œ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° pipealloc():

#define PIPESIZE 512

struct pipe {
  struct spinlock lock;
  char data[PIPESIZE];
  uint nread;     // number of bytes read
  uint nwrite;    // number of bytes written
  int readopen;   // read fd is still open
  int writeopen;  // write fd is still open
};

int
pipealloc(struct file **f0, struct file **f1)
{
  struct pipe *p;

  p = 0;
  *f0 = *f1 = 0;
  if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0)
    goto bad;
  if((p = (struct pipe*)kalloc()) == 0)
    goto bad;
  p->readopen = 1;
  p->writeopen = 1;
  p->nwrite = 0;
  p->nread = 0;
  initlock(&p->lock, "pipe");
  (*f0)->type = FD_PIPE;
  (*f0)->readable = 1;
  (*f0)->writable = 0;
  (*f0)->pipe = p;
  (*f1)->type = FD_PIPE;
  (*f1)->readable = 0;
  (*f1)->writable = 1;
  (*f1)->pipe = p;
  return 0;

 bad:
  if(p)
    kfree((char*)p);
  if(*f0)
    fileclose(*f0);
  if(*f1)
    fileclose(*f1);
  return -1;
}

pipealloc() ја поставува ΡΠΎΡΡ‚ΠΎΡ˜Π±Π°Ρ‚Π° Π½Π° остатокот ΠΎΠ΄ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°, која Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ piperead(), pipewrite() ΠΈ pipeclose(). Вистинскиот систСмски ΠΏΠΎΠ²ΠΈΠΊ sys_pipe Π΅ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π° Π²ΠΎ sysfile.Π². ΠŸΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡ΡƒΠ²Π°ΠΌ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ Ρ†Π΅Π»ΠΈΠΎΡ‚ Π½Π΅Π³ΠΎΠ² ΠΊΠΎΠ΄. ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½ΠΎΡΡ‚Π° Π΅ Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ Π½Π° ΡˆΠ΅ΡΡ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅, Π½ΠΎ Π΅ ΠΌΠ½ΠΎΠ³Ρƒ полСсСн ΠΈ ΠΏΠΎΠΏΡ€ΠΈΡ˜Π°Ρ‚Π΅Π½ Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅.

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 Π³ΠΎΠ΄ΠΈΠ½Π°, написот β€žΠ˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π½Π° Linux Π½Π° Ρ†Π΅Π²ΠΊΠΈ ΠΈ FIFOΠ΅ ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Π°Ρ‚ Π½Π°Ρ„Ρ‚ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° Линукс (досСга). А нСодамнСшно ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° Линукс Π³ΠΎ илустрира ΠΌΠΎΠ΄Π΅Π»ΠΎΡ‚ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π° Π½Π° гасоводот, Ρ‡ΠΈΠΈ моТности Π³ΠΈ Π½Π°Π΄ΠΌΠΈΠ½ΡƒΠ²Π°Π°Ρ‚ ΠΎΠ½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΈΠ²Ρ€Π΅ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ; ΠΈ исто Ρ‚Π°ΠΊΠ° ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π° ΠΊΠΎΠ»ΠΊΡƒ Π΄Π°Π»Π΅ΠΊΡƒ ΠΎΡ‚ΠΈΡˆΠ»Π΅ Ρ†Π΅Π²ΠΊΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΎΠ΄ β€žΠΌΠ½ΠΎΠ³Ρƒ ΠΊΠΎΠ½Π·Π΅Ρ€Π²Π°Ρ‚ΠΈΠ²Π½ΠΎΡ‚ΠΎ Π·Π°ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°ΡšΠ΅β€œ Π²ΠΎ ΡˆΠ΅ΡΡ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€