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

Како сС Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ˜Ρƒ Ρƒ Π£Π½ΠΈΠΊ-Ρƒ
Овај Ρ‡Π»Π°Π½Π°ΠΊ ΠΎΠΏΠΈΡΡƒΡ˜Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π° Ρƒ Π£Π½ΠΈΠΊ ΠΊΠ΅Ρ€Π½Π΅Π»Ρƒ. Π‘ΠΈΠΎ сам ΠΏΠΎΠΌΠ°Π»ΠΎ Ρ€Π°Π·ΠΎΡ‡Π°Ρ€Π°Π½ ΡˆΡ‚ΠΎ јС Π½Π΅Π΄Π°Π²Π½ΠΈ Ρ‡Π»Π°Π½Π°ΠΊ ΠΏΠΎΠ΄ насловом "Како Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡˆΡƒ Ρƒ Π£Π½ΠΈΠΊΡƒ?"Π˜ΡΠΏΠΎΡΡ‚Π°Π²ΠΈΠ»ΠΎ сС Π½Π΅ ΠΎ ΡƒΠ½ΡƒΡ‚Ρ€Π°ΡˆΡšΠΎΡ˜ структури. ΠŸΠΎΡΡ‚Π°ΠΎ сам Ρ€Π°Π΄ΠΎΠ·Π½Π°ΠΎ ΠΈ ΠΊΠΎΠΏΠ°ΠΎ сам ΠΏΠΎ старим ΠΈΠ·Π²ΠΎΡ€ΠΈΠΌΠ° Π΄Π° ΠΏΡ€ΠΎΠ½Π°Ρ’Π΅ΠΌ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€.

Π¨Ρ‚Π° Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌΠΎ?

Π¦Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ, β€žΠ²Π΅Ρ€ΠΎΠ²Π°Ρ‚Π½ΠΎ најваТнији ΠΏΡ€ΠΎΠ½Π°Π»Π°Π·Π°ΠΊ Ρƒ Π£Π½ΠΈΠΊ-Ρƒ,” су Π΄Π΅Ρ„ΠΈΠ½ΠΈΡˆΡƒΡ›Π° карактСристика основнС Π£Π½ΠΈΠΊ Ρ„ΠΈΠ»ΠΎΠ·ΠΎΡ„ΠΈΡ˜Π΅ повСзивања ΠΌΠ°Π»ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° зајСдно, ΠΊΠ°ΠΎ ΠΈ ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ Π·Π½Π°ΠΊ Π½Π° командној линији:

$ 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 ΠΈ 4 Π΄Π° Π±ΠΈ сС ускладили са стдин ΠΈ стдоут.

Π‘Π΅Π· Ρ†Π΅Π²ΠΈ, љуска Π±ΠΈ ΠΌΠΎΡ€Π°Π»Π° Π΄Π° запишС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ јСдног процСса Ρƒ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΡƒ ΠΈ прослСди Π³Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ процСсу Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ ΠΈΠ· Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ΅. Као Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Ρ‚ΠΎΠ³Π°, Ρ‚Ρ€ΠΎΡˆΠΈΠ»ΠΈ бисмо вишС рСсурса ΠΈ простора Π½Π° диску. ΠœΠ΅Ρ’ΡƒΡ‚ΠΈΠΌ, Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ су Π΄ΠΎΠ±Ρ€ΠΈ Π½Π΅ само Π·Π°Ρ‚ΠΎ ΡˆΡ‚ΠΎ Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π°Ρ˜Ρƒ Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅Ρ‚Π΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Ρƒ ΠΏΡ€ΠΈΠ²Ρ€Π΅ΠΌΠ΅Π½ΠΈΡ… Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°:

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

Као ΠΈ Π·Π°Ρ…Ρ‚Π΅Π² ПОБИКБ, ΠΎΠ²ΠΎ јС Π²Π°ΠΆΠ½ΠΎ ΡΠ²ΠΎΡ˜ΡΡ‚Π²ΠΎ: писањС Ρƒ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ Π΄ΠΎ PIPE_BUF Π±Π°Ρ˜Ρ‚ΠΎΠ²ΠΈ (најмањС 512) ΠΌΠΎΡ€Π°Ρ˜Ρƒ Π±ΠΈΡ‚ΠΈ атомски ΠΊΠ°ΠΊΠΎ Π±ΠΈ процСси ΠΌΠΎΠ³Π»ΠΈ Π΄Π° ΠΊΠΎΠΌΡƒΠ½ΠΈΡ†ΠΈΡ€Π°Ρ˜Ρƒ јСдни са Π΄Ρ€ΡƒΠ³ΠΈΠΌΠ° ΠΊΡ€ΠΎΠ· Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ Π½Π° Π½Π°Ρ‡ΠΈΠ½ Π½Π° који ΠΎΠ±ΠΈΡ‡Π½ΠΈ Ρ„Π°Ρ˜Π»ΠΎΠ²ΠΈ (који Π½Π΅ ΠΏΡ€ΡƒΠΆΠ°Ρ˜Ρƒ Ρ‚Π°ΠΊΠ²Π΅ Π³Π°Ρ€Π°Π½Ρ†ΠΈΡ˜Π΅) Π½Π΅ ΠΌΠΎΠ³Ρƒ.

Када сС користи ΠΎΠ±ΠΈΡ‡Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°, процСс ΠΌΠΎΠΆΠ΅ записати сав свој ΠΈΠ·Π»Π°Π· Ρƒ њСга ΠΈ прослСдити Π³Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ процСсу. Или процСси ΠΌΠΎΠ³Ρƒ Π΄Π° Ρ€Π°Π΄Π΅ Ρƒ Π²Π΅ΠΎΠΌΠ° ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΡƒ, користСћи спољни ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π΅ (ΠΏΠΎΠΏΡƒΡ‚ сСмафора) Π΄Π° ΠΎΠ±Π°Π²Π΅ΡˆΡ‚Π°Π²Π°Ρ˜Ρƒ јСдни Π΄Ρ€ΡƒΠ³Π΅ ΠΊΠ°Π΄Π° сС ΡƒΠΏΠΈΡΠΈΠ²Π°ΡšΠ΅ ΠΈΠ»ΠΈ Ρ‡ΠΈΡ‚Π°ΡšΠ΅ Π·Π°Π²Ρ€ΡˆΠΈ. ВранспортСри нас ΡΠΏΠ°ΡΠ°Π²Π°Ρ˜Ρƒ ΠΎΠ΄ свих ΠΎΠ²ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Π¨Ρ‚Π° Ρ‚Ρ€Π°ΠΆΠΈΠΌΠΎ?

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

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

Π“Π΄Π΅ Ρ‚Ρ€Π°ΠΆΠΈΠΌΠΎ?

НС Π·Π½Π°ΠΌ Π³Π΄Π΅ јС мој ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΊ Ρ‡ΡƒΠ²Π΅Π½Π΅ ΠΊΡšΠΈΠ³Π΅β€œΠšΡšΠΈΠ³Π° ΠΎ Π»Π°Π²ΠΎΠ²ΠΈΠΌΠ°β€žΡΠ° Π£Π½ΠΈΠΊ 6 ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, Π°Π»ΠΈ Π·Π°Ρ…Π²Π°Ρ™ΡƒΡ˜ΡƒΡ›ΠΈ Π£Π½ΠΈΠΊ Π₯Π΅Ρ€ΠΈΡ‚Π°Π³Π΅ Π‘ΠΎΡ†ΠΈΠ΅Ρ‚ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Ρ‚Ρ€Π°ΠΆΠΈΠ²Π°Ρ‚ΠΈ Π½Π° ΠΌΡ€Π΅ΠΆΠΈ Π½Π° ΠΈΠ·Π²ΠΎΡ€Π½ΠΈ ΠΊΠΎΠ΄ Ρ‡Π°ΠΊ ΠΈ ΡΡ‚Π°Ρ€ΠΈΡ˜Π΅ Π²Π΅Ρ€Π·ΠΈΡ˜Π΅ Π£Π½ΠΈΠΊΠ°.

Π›ΡƒΡ‚Π°ΡšΠ΅ ΠΊΡ€ΠΎΠ· Π’Π£Π₯Π‘ Π°Ρ€Ρ…ΠΈΠ²Π΅ јС ΠΊΠ°ΠΎ посСта ΠΌΡƒΠ·Π΅Ρ˜Ρƒ. МоТСмо Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ Π½Π°ΡˆΡƒ Π·Π°Ρ˜Π΅Π΄Π½ΠΈΡ‡ΠΊΡƒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜Ρƒ, ΠΈ ΠΏΠΎΡˆΡ‚ΡƒΡ˜Π΅ΠΌ Π΄ΡƒΠ³ΠΎΠ³ΠΎΠ΄ΠΈΡˆΡšΠ΅ Π½Π°ΠΏΠΎΡ€Π΅ Π΄Π° сС сав овај ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π» ΠΏΠΎ ΠΌΠ°Π»ΠΎ ΠΏΠΎΠ²Ρ€Π°Ρ‚ΠΈ са старих Ρ‚Ρ€Π°ΠΊΠ° ΠΈ отисака. И Π²Π΅ΠΎΠΌΠ° сам свСстан Ρ‚ΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Π°Ρ‚Π° који још ΡƒΠ²Π΅ΠΊ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ˜Ρƒ.

ΠŸΠΎΡˆΡ‚ΠΎ смо Π·Π°Π΄ΠΎΠ²ΠΎΡ™ΠΈΠ»ΠΈ Π½Π°ΡˆΡƒ радозналост ΠΎ Π΄Ρ€Π΅Π²Π½ΠΎΡ˜ ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜ΠΈ транспортСра, ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ ΠΌΠΎΠ΄Π΅Ρ€Π½Π° Ρ˜Π΅Π·Π³Ρ€Π° Π·Π° ΠΏΠΎΡ€Π΅Ρ’Π΅ΡšΠ΅.

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

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π°Π»Π½Π° Π£Π½ΠΈΠΊ Ρ˜Π΅Π·Π³Ρ€Π° (1970–1974)

Нисам нашао Π½ΠΈΠΊΠ°ΠΊΠ²Π΅ Ρ‚Ρ€Π°Π³ΠΎΠ²Π΅ pipe(2) ni u ΠŸΠ”ΠŸ-7 Π£Π½ΠΈΠΊ (Ρ˜Π°Π½ΡƒΠ°Ρ€ 1970), Π½ΠΈ Ρƒ ΠΏΡ€Π²ΠΎ издањС Π£Π½ΠΈΠΊ-Π° (Π½ΠΎΠ²Π΅ΠΌΠ±Π°Ρ€ 1971), Π½ΠΈΡ‚ΠΈ Ρƒ Π½Π΅ΠΏΠΎΡ‚ΠΏΡƒΠ½ΠΎΠΌ ΠΈΠ·Π²ΠΎΡ€Π½ΠΎΠΌ ΠΊΠΎΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎ издањС (Ρ˜ΡƒΠ½ 1972).

Π’Π£Π₯Π‘ Ρ‚ΠΎ Π½Π°Π²ΠΎΠ΄ΠΈ Ρ‚Ρ€Π΅Ρ›Π΅ издањС Π£Π½ΠΈΠΊ-Π° (Ρ„Π΅Π±Ρ€ΡƒΠ°Ρ€ 1973) постала јС ΠΏΡ€Π²Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° са ΠΏΠΎΠΊΡ€Π΅Ρ‚Π½ΠΈΠΌ Ρ‚Ρ€Π°ΠΊΠ°ΠΌΠ°:

Π£Π½ΠΈΠΊ 1973Ρ€Π΄ Π•Π΄ΠΈΡ‚ΠΈΠΎΠ½ јС Π±ΠΈΠ»Π° послСдња Π²Π΅Ρ€Π·ΠΈΡ˜Π° са ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΠΌ написаним Π½Π° асСмблСрском Ρ˜Π΅Π·ΠΈΠΊΡƒ, Π°Π»ΠΈ ΠΈ ΠΏΡ€Π²Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° са Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈΠΌΠ°. Π’ΠΎΠΊΠΎΠΌ XNUMX. Π³ΠΎΠ΄ΠΈΠ½Π΅ Ρ€Π°Π΄ΠΈΠ»ΠΎ сС Π½Π° ΠΏΠΎΠ±ΠΎΡ™ΡˆΠ°ΡšΡƒ Ρ‚Ρ€Π΅Ρ›Π΅Π³ издања, ΠΊΠ΅Ρ€Π½Π΅Π» јС прСписан Ρƒ Π¦, ΠΈ Ρ‚Π°ΠΊΠΎ сС појавило Ρ‡Π΅Ρ‚Π²Ρ€Ρ‚ΠΎ издањС Π£Π½ΠΈΠΊΠ°.

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

Како сС Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ˜Ρƒ Ρƒ Π£Π½ΠΈΠΊ-Ρƒ
Π£ књизи Π‘Ρ€Π°Ρ˜Π°Π½Π° ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½Π°Π£Π½ΠΈΠΊ: Π˜ΡΡ‚ΠΎΡ€ΠΈΡ˜Π° ΠΈ ΠΌΠ΅ΠΌΠΎΠ°Ρ€ΠΈβ€œ, Ρƒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡ˜ΠΈ настанка транспортСра помињС сС ΠΈ овај Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚: β€ž... висио јС Π½Π° Π·ΠΈΠ΄Ρƒ Ρƒ мојој ΠΊΠ°Π½Ρ†Π΅Π»Π°Ρ€ΠΈΡ˜ΠΈ Ρƒ Π‘Π΅Π»Π» Лабс-Ρƒ 30 Π³ΠΎΠ΄ΠΈΠ½Π°.” Π•Π²ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Ρ˜Ρƒ са ΠœΠ΅ΠΊΠΈΠ»Ρ€ΠΎΡ˜Π΅ΠΌ, ΠΈ још јСдна ΠΏΡ€ΠΈΡ‡Π° ΠΈΠ· ΠœΠ΅ΠΊΠΈΠ»Ρ€ΠΎΡ˜Π΅Π²ΠΎ Π΄Π΅Π»ΠΎ, написано 2014:

Када сС појавио Π£Π½ΠΈΠΊ, моја Ρ„Π°ΡΡ†ΠΈΠ½Π°Ρ†ΠΈΡ˜Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌΠ° ΠΌΠ΅ јС Π½Π°Π²Π΅Π»Π° Π΄Π° Π·Π°ΠΌΠΎΠ»ΠΈΠΌ Π°ΡƒΡ‚ΠΎΡ€Π° ОБ-Π°, КСна Вомпсона, Π΄Π° Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΠΏΠΎΠ΄Π°Ρ†ΠΈ уписани Ρƒ процСс ΠΈΠ΄Ρƒ Π½Π΅ само Π½Π° ΡƒΡ€Π΅Ρ’Π°Ρ˜, Π²Π΅Ρ› ΠΈ Π΄Π° ΠΈΠ·Π»Π°Π·Π΅ Ρƒ Π΄Ρ€ΡƒΠ³ΠΈ процСс. КСн јС ΠΎΠ΄Π»ΡƒΡ‡ΠΈΠΎ Π΄Π° јС Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ›Π΅. ΠœΠ΅Ρ’ΡƒΡ‚ΠΈΠΌ, ΠΊΠ°ΠΎ минималиста, ΠΆΠ΅Π»Π΅ΠΎ јС Π΄Π° свака Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° систСма ΠΈΠ³Ρ€Π° Π·Π½Π°Ρ‡Π°Ρ˜Π½Ρƒ ΡƒΠ»ΠΎΠ³Ρƒ. Π”Π° Π»ΠΈ јС писањС Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ’Ρƒ процСса заиста Π²Π΅Π»ΠΈΠΊΠ° прСдност Ρƒ односу Π½Π° писањС Ρƒ посрСдни Ρ„Π°Ρ˜Π»? Π’Π΅ΠΊ ΠΊΠ°Π΄Π° сам Π΄Π°ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π°Π½ ΠΏΡ€Π΅Π΄Π»ΠΎΠ³ са ΠΏΡ€ΠΈΠ²Π»Π°Ρ‡Π½ΠΈΠΌ Π½Π°Π·ΠΈΠ²ΠΎΠΌ β€žΡ†Π΅Π²ΠΎΠ²ΠΎΠ΄β€œ ΠΈ описом синтаксС Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Ρƒ ΠΈΠ·ΠΌΠ΅Ρ’Ρƒ процСса, КСн јС ΠΊΠΎΠ½Π°Ρ‡Π½ΠΎ ΡƒΠ·Π²ΠΈΠΊΠ½ΡƒΠΎ: β€žΠ£Ρ€Π°Π΄ΠΈΡ›Ρƒ Ρ‚ΠΎ!β€œ

И Ρ˜Π΅ΡΡ‚Π΅. ЈСднС ΠΊΠΎΠ±Π½Π΅ Π²Π΅Ρ‡Π΅Ρ€ΠΈ, КСн јС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΎ ΠΊΠ΅Ρ€Π½Π΅Π» ΠΈ љуску, ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠΎ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ стандардних ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΊΠ°ΠΊΠΎ Π±ΠΈ стандардизовао Π½Π°Ρ‡ΠΈΠ½ Π½Π° који ΠΏΡ€ΠΈΡ…Π²Π°Ρ‚Π°Ρ˜Ρƒ унос (који Π±ΠΈ ΠΌΠΎΠ³Π°ΠΎ Π΄Π° Π΄ΠΎΡ’Π΅ ΠΈΠ· Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π°), Π° Ρ‚Π°ΠΊΠΎΡ’Π΅ јС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΎ ΠΈΠΌΠ΅Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°. Π‘Π»Π΅Π΄Π΅Ρ›Π΅Π³ Π΄Π°Π½Π°, Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ су ΠΏΠΎΡ‡Π΅Π»ΠΈ Π΄Π° сС Π²Π΅ΠΎΠΌΠ° ΡˆΠΈΡ€ΠΎΠΊΠΎ користС Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°ΠΌΠ°. Π”ΠΎ ΠΊΡ€Π°Ρ˜Π° Π½Π΅Π΄Π΅Ρ™Π΅, сСкрСтарицС су ΠΈΡ… користилС Π·Π° слањС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Π°Ρ‚Π° ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π·Π° ΠΎΠ±Ρ€Π°Π΄Ρƒ тСкста Ρƒ ΡˆΡ‚Π°ΠΌΠΏΠ°Ρ‡. ΠΠ΅ΡˆΡ‚ΠΎ каснијС, КСн јС Π·Π°ΠΌΠ΅Π½ΠΈΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈ АПИ ΠΈ синтаксу Π·Π° ΡƒΠΌΠΎΡ‚Π°Π²Π°ΡšΠ΅ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π΅ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π° Ρ‡ΠΈΡΡ‚ΠΈΡ˜ΠΈΠΌ ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΡ˜Π°ΠΌΠ°, којС сС ΠΎΠ΄ Ρ‚Π°Π΄Π° користС.

НаТалост, ΠΈΠ·Π²ΠΎΡ€Π½ΠΈ ΠΊΠΎΠ΄ Π·Π° Ρ‚Ρ€Π΅Ρ›Π΅ издањС Π£Π½ΠΈΠΊ ΠΊΠ΅Ρ€Π½Π΅Π»Π° јС ΠΈΠ·Π³ΡƒΠ±Ρ™Π΅Π½. И ΠΈΠ°ΠΊΠΎ ΠΈΠΌΠ°ΠΌΠΎ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈ ΠΊΠΎΠ΄ ΠΊΠ΅Ρ€Π½Π΅Π»Π° написан Ρƒ Π¦ Ρ‡Π΅Ρ‚Π²Ρ€Ρ‚ΠΎ издањС, ΠΎΠ±Ρ˜Π°Π²Ρ™Π΅Π½ Ρƒ Π½ΠΎΠ²Π΅ΠΌΠ±Ρ€Ρƒ 1973. Π³ΠΎΠ΄ΠΈΠ½Π΅, Π°Π»ΠΈ јС изашао Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ мСсСци ΠΏΡ€Π΅ Π·Π²Π°Π½ΠΈΡ‡Π½ΠΎΠ³ ΠΎΠ±Ρ˜Π°Π²Ρ™ΠΈΠ²Π°ΡšΠ° ΠΈ Π½Π΅ садрТи ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π°. Π¨Ρ‚Π΅Ρ‚Π° ΡˆΡ‚ΠΎ јС ΠΈΠ·Π²ΠΎΡ€Π½ΠΈ ΠΊΠΎΠ΄ Π·Π° ΠΎΠ²Ρƒ Π»Π΅Π³Π΅Π½Π΄Π°Ρ€Π½Ρƒ Π£Π½ΠΈΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Ρƒ ΠΈΠ·Π³ΡƒΠ±Ρ™Π΅Π½, ΠΌΠΎΠΆΠ΄Π° Π·Π°ΡƒΠ²Π΅ΠΊ.

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

БистСмски ΠΏΠΎΠ·ΠΈΠ² Ρ†Π΅Π² ствара ΡƒΠ»Π°Π·Π½ΠΎ/ΠΈΠ·Π»Π°Π·Π½ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ који сС Π½Π°Π·ΠΈΠ²Π° Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄. Π’Ρ€Π°Ρ›Π΅Π½ΠΈ дСскриптор Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ΅ ΠΌΠΎΠΆΠ΅ сС користити Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π΅ Ρ‡ΠΈΡ‚Π°ΡšΠ° ΠΈ писања. Када сС Π½Π΅ΡˆΡ‚ΠΎ ΡƒΠΏΠΈΡˆΠ΅ Ρƒ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄, Π±Π°Ρ„Π΅Ρ€ΡƒΡ˜Π΅ сС Π΄ΠΎ 504 Π±Π°Ρ˜Ρ‚Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°, Π½Π°ΠΊΠΎΠ½ Ρ‡Π΅Π³Π° сС процСс писања ΡΡƒΡΠΏΠ΅Π½Π΄ΡƒΡ˜Π΅. ΠŸΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ Ρ‡ΠΈΡ‚Π°ΡšΠ° ΠΈΠ· Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π°, Π±Π°Ρ„Π΅Ρ€ΠΎΠ²Π°Π½ΠΈ ΠΏΠΎΠ΄Π°Ρ†ΠΈ сС ΠΎΠ΄ΡƒΠ·ΠΈΠΌΠ°Ρ˜Ρƒ.

Π”ΠΎ слСдСћС Π³ΠΎΠ΄ΠΈΠ½Π΅ Ρ˜Π΅Π·Π³Ρ€ΠΎ јС прСписано Ρƒ Π¦, ΠΈ ΠΏΠΈΠΏΠ΅(2) Ρƒ Ρ‡Π΅Ρ‚Π²Ρ€Ρ‚ΠΎΠΌ ΠΈΠ·Π΄Π°ΡšΡƒ Π΄ΠΎΠ±ΠΈΠΎ свој ΠΌΠΎΠ΄Π΅Ρ€Π°Π½ ΠΈΠ·Π³Π»Π΅Π΄ са ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠΌ"pipe(fildes)"

БистСмски ΠΏΠΎΠ·ΠΈΠ² Ρ†Π΅Π² ствара ΡƒΠ»Π°Π·Π½ΠΎ/ΠΈΠ·Π»Π°Π·Π½ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ који сС Π½Π°Π·ΠΈΠ²Π° Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄. ДСскриптори Π²Ρ€Π°Ρ›Π΅Π½ΠΈΡ… Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠ³Ρƒ сС користити Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π°ΠΌΠ° Ρ‡ΠΈΡ‚Π°ΡšΠ° ΠΈ писања. Када сС Π½Π΅ΡˆΡ‚ΠΎ ΡƒΠΏΠΈΡˆΠ΅ Ρƒ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄, користи сС Ρ€ΡƒΡ‡ΠΊΠ° Π²Ρ€Π°Ρ›Π΅Π½Π° Ρƒ Ρ€1 (односно филдСс[1]), Π±Π°Ρ„Π΅Ρ€ΠΎΠ²Π°Π½Π° Π½Π° 4096 Π±Π°Ρ˜Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°, Π½Π°ΠΊΠΎΠ½ Ρ‡Π΅Π³Π° сС процСс писања ΡΡƒΡΠΏΠ΅Π½Π΄ΡƒΡ˜Π΅. ΠŸΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ Ρ‡ΠΈΡ‚Π°ΡšΠ° ΠΈΠ· Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π°, Ρ€ΡƒΡ‡ΠΈΡ†Π° Π²Ρ€Π°Ρ›Π΅Π½Π° Π½Π° Ρ€0 (односно филдСс[0]) ΠΏΡ€Π΅ΡƒΠ·ΠΈΠΌΠ° ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅.

ΠŸΡ€Π΅Ρ‚ΠΏΠΎΡΡ‚Π°Π²Ρ™Π° сС Π΄Π° ΠΊΠ°Π΄Π° јС Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ дСфинисан, Π΄Π²Π° (ΠΈΠ»ΠΈ вишС) ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½ΠΈΡ… процСса (ΠΊΡ€Π΅ΠΈΡ€Π°Π½ΠΈ Π½Π°ΠΊΠ½Π°Π΄Π½ΠΈΠΌ ΠΏΠΎΠ·ΠΈΠ²ΠΈΠΌΠ° ΠΊΠ° Π²ΠΈΡ™ΡƒΡˆΠΊΠ°) Ρ›Π΅ ΠΏΡ€Π΅Π½Π΅Ρ‚ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ ΠΈΠ· Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π° ΠΏΠΎΠΌΠΎΡ›Ρƒ ΠΏΠΎΠ·ΠΈΠ²Π° Ρ‡ΠΈΡ‚Π°Ρ‚ΠΈ ΠΈ write (писати).

Π‘Ρ…Π΅Π»Π» ΠΈΠΌΠ° синтаксу Π·Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡΠ°ΡšΠ΅ Π»ΠΈΠ½Π΅Π°Ρ€Π½ΠΎΠ³ Π½ΠΈΠ·Π° процСса ΠΏΠΎΠ²Π΅Π·Π°Π½ΠΈΡ… Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΎΠΌ.

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

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

ШСсто издањС Π£Π½ΠΈΠΊΠ° (1975)

ΠŸΠΎΡ‡Π½ΠΈΠΌΠΎ Π΄Π° Ρ‡ΠΈΡ‚Π°ΠΌΠΎ Π£Π½ΠΈΠΊ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈ ΠΊΠΎΠ΄ ΡˆΠ΅ΡΡ‚ΠΎ издањС (мај 1975). Π£ вСликој ΠΌΠ΅Ρ€ΠΈ Π·Π°Ρ…Π²Π°Ρ™ΡƒΡ˜ΡƒΡ›ΠΈ ЗнамСнитости ΠΌΠ½ΠΎΠ³ΠΎ јС лакшС ΠΏΡ€ΠΎΠ½Π°Ρ›ΠΈ Π½Π΅Π³ΠΎ ΠΈΠ·Π²ΠΎΡ€Π΅ Ρ€Π°Π½ΠΈΡ˜ΠΈΡ… Π²Π΅Ρ€Π·ΠΈΡ˜Π°:

Π”ΡƒΠ³ΠΈ Π½ΠΈΠ· Π³ΠΎΠ΄ΠΈΠ½Π° књига ЗнамСнитости јС Π±ΠΈΠΎ јСдини Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ ΠΎ Π£Π½ΠΈΠΊ ΠΊΠ΅Ρ€Π½Π΅Π»Ρƒ доступан Π²Π°Π½ Π‘Π΅Π»Π» Лабс-Π°. Иако јС Π»ΠΈΡ†Π΅Π½Ρ†Π° ΡˆΠ΅ΡΡ‚ΠΎΠ³ издања ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π°Π»Π° наставницима Π΄Π° користС њСн ΠΈΠ·Π²ΠΎΡ€Π½ΠΈ ΠΊΠΎΠ΄, Π»ΠΈΡ†Π΅Π½Ρ†Π° сСдмог издања јС искључила ΠΎΠ²Ρƒ могућност, ΠΏΠ° јС књига дистрибуирана Ρƒ ΠΎΠ±Π»ΠΈΠΊΡƒ ΠΈΠ»Π΅Π³Π°Π»Π½ΠΈΡ… ΠΊΡƒΡ†Π°Π½ΠΈΡ… копија.

Данас ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΡƒΠΏΠΈΡ‚ΠΈ Ρ€Π΅ΠΏΡ€ΠΈΠ½Ρ‚ књигС Π½Π° Ρ‡ΠΈΡ˜ΠΈΠΌ ΠΊΠΎΡ€ΠΈΡ†Π°ΠΌΠ° су ΡƒΡ‡Π΅Π½ΠΈΡ†ΠΈ Π·Π° Ρ„ΠΎΡ‚ΠΎΠΊΠΎΠΏΠΈΡ€ машином. И Π·Π°Ρ…Π²Π°Ρ™ΡƒΡ˜ΡƒΡ›ΠΈ Π’ΠΎΡ€Π΅Π½Ρƒ Π’ΠΎΠΎΠΌΠΈΡ˜Ρƒ (који јС Π·Π°ΠΏΠΎΡ‡Π΅ΠΎ ΠΏΡ€ΠΎΡ˜Π΅ΠΊΠ°Ρ‚ Π’Π£Π₯Π‘) ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅ΡƒΠ·Π΅Ρ‚ΠΈ ΠŸΠ”Π€ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° са ΠΈΠ·Π²ΠΎΡ€Π½ΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Π·Π° ΡˆΠ΅ΡΡ‚ΠΎ издањС. Π–Π΅Π»ΠΈΠΌ Π΄Π° Π²Π°ΠΌ Π΄Π°ΠΌ прСдставу ΠΎ Ρ‚ΠΎΠΌΠ΅ ΠΊΠΎΠ»ΠΈΠΊΠΎ јС Ρ‚Ρ€ΡƒΠ΄Π° ΡƒΠ»ΠΎΠΆΠ΅Π½ΠΎ Ρƒ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ΅:

ΠŸΡ€Π΅ вишС ΠΎΠ΄ 15 Π³ΠΎΠ΄ΠΈΠ½Π°, ΠΎΡ‚ΠΊΡƒΡ†Π°ΠΎ сам ΠΊΠΎΠΏΠΈΡ˜Ρƒ Π΄Π°Ρ‚ΠΎΠ³ ΠΈΠ·Π²ΠΎΡ€Π½ΠΎΠ³ ΠΊΠΎΠ΄Π° ЗнамСнитости, Ρ˜Π΅Ρ€ ΠΌΠΈ сС нијС Π΄ΠΎΠΏΠ°ΠΎ ΠΊΠ²Π°Π»ΠΈΡ‚Π΅Ρ‚ ΠΌΠΎΠ³ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΊΠ° ΠΈΠ· Π½Π΅ΠΏΠΎΠ·Π½Π°Ρ‚ΠΎΠ³ Π±Ρ€ΠΎΡ˜Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΊΠ°. Π’Π£Π₯Π‘ још нијС ΠΏΠΎΡΡ‚ΠΎΡ˜Π°ΠΎ ΠΈ нисам ΠΈΠΌΠ°ΠΎ приступ старим ΠΈΠ·Π²ΠΎΡ€ΠΈΠΌΠ°. Али 1988. ΠΏΡ€ΠΎΠ½Π°ΡˆΠ°ΠΎ сам стару Ρ‚Ρ€Π°ΠΊΡƒ са 9 Ρ‚Ρ€Π°ΠΊΠ° која јС садрТала Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρƒ ΠΊΠΎΠΏΠΈΡ˜Ρƒ са ΠŸΠ”ΠŸ11 Ρ€Π°Ρ‡ΡƒΠ½Π°Ρ€Π°. Π‘ΠΈΠ»ΠΎ јС Ρ‚Π΅ΡˆΠΊΠΎ Ρ€Π΅Ρ›ΠΈ Π΄Π° Π»ΠΈ Ρ€Π°Π΄ΠΈ, Π°Π»ΠΈ ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Π»ΠΎ јС Π½Π΅Ρ‚Π°ΠΊΠ½ΡƒΡ‚ΠΎ /уср/срц/ стабло Ρƒ којСм јС Π²Π΅Ρ›ΠΈΠ½Π° Ρ„Π°Ρ˜Π»ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π° са Π³ΠΎΠ΄ΠΈΠ½ΠΎΠΌ 1979, која јС Ρ‡Π°ΠΊ ΠΈ Ρ‚Π°Π΄Π° ΠΈΠ·Π³Π»Π΅Π΄Π°Π»Π° Π΄Ρ€Π΅Π²Π½ΠΎ. Π‘ΠΈΠ»ΠΎ јС Ρ‚ΠΎ сСдмо издањС ΠΈΠ»ΠΈ њСгов Π΄Π΅Ρ€ΠΈΠ²Π°Ρ‚ ΠŸΠ’Π‘, ΠΊΠ°ΠΊΠΎ сам Π²Π΅Ρ€ΠΎΠ²Π°ΠΎ.

Π£Π·Π΅ΠΎ сам Π½Π°Π»Π°Π· ΠΊΠ°ΠΎ основу ΠΈ Ρ€ΡƒΡ‡Π½ΠΎ ΡƒΡ€Π΅Π΄ΠΈΠΎ ΠΈΠ·Π²ΠΎΡ€Π΅ Π΄ΠΎ ΡˆΠ΅ΡΡ‚ΠΎΠ³ издања. НСки ΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΠ²Π° су остали исти, Π°Π»ΠΈ су Π½Π΅ΠΊΠΈ ΠΌΠΎΡ€Π°Π»ΠΈ Π±ΠΈΡ‚ΠΈ ΠΌΠ°Π»ΠΎ измСњСни, ΠΌΠ΅ΡšΠ°Ρ˜ΡƒΡ›ΠΈ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ += Ρƒ застарСли =+. НСкС ствари су Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎ обрисанС, Π° Π½Π΅ΠΊΠ΅ су ΠΌΠΎΡ€Π°Π»Π΅ Π±ΠΈΡ‚ΠΈ ΠΏΠΎΡ‚ΠΏΡƒΠ½ΠΎ прСписанС, Π°Π»ΠΈ Π½Π΅ ΠΏΡ€Π΅Π²ΠΈΡˆΠ΅.

А данас ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° Ρ‡ΠΈΡ‚Π°ΠΌΠΎ онлајн Π½Π° Π’Π£Π₯Π‘ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈ ΠΊΠΎΠ΄ ΡˆΠ΅ΡΡ‚ΠΎΠ³ издања ΠΎΠ΄ Π°Ρ€Ρ…ΠΈΠ²Ρƒ, којој јС Ρ€ΡƒΠΊΡƒ ΠΈΠΌΠ°ΠΎ ДСнис Π ΠΈΡ‡ΠΈ.

Π˜Π½Π°Ρ‡Π΅, Π½Π° ΠΏΡ€Π²ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄, Π³Π»Π°Π²Π½Π° карактСристика Π¦-ΠΊΠΎΠ΄Π° ΠΏΡ€Π΅ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½Π° ΠΈ Π ΠΈΡ‡ΠΈΡ˜Π° јС њСгова ΠΊΡ€Π°Ρ‚ΠΊΠΎΡ›Π°. НијС чСсто Π΄Π° ΠΌΠΎΠ³Ρƒ Π΄Π° ΡƒΠ±Π°Ρ†ΠΈΠΌ Π΄Π΅Π»ΠΎΠ²Π΅ ΠΊΠΎΠ΄Π° Π±Π΅Π· опсСТног ΡƒΡ€Π΅Ρ’ΠΈΠ²Π°ΡšΠ° ΠΊΠ°ΠΊΠΎ Π±ΠΈ сС ΡƒΠΊΠ»ΠΎΠΏΠΈΠΎ Ρƒ Ρ€Π΅Π»Π°Ρ‚ΠΈΠ²Π½ΠΎ уско ΠΏΠΎΠ΄Ρ€ΡƒΡ‡Ρ˜Π΅ ΠΏΡ€ΠΈΠΊΠ°Π·Π° Π½Π° мојој Π²Π΅Π± Π»ΠΎΠΊΠ°Ρ†ΠΈΡ˜ΠΈ.

Π Π°Π½ΠΎ /уср/сис/ΠΊΠ΅Π½/ΠΏΠΈΠΏΠ΅.Ρ† ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ са објашњСњСм (ΠΈ Π΄Π°, ΠΈΠΌΠ° ΠΈΡ… још /уср/сис/Π΄ΠΌΡ€):

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

Π’Π΅Π»ΠΈΡ‡ΠΈΠ½Π° Π±Π°Ρ„Π΅Ρ€Π° сС нијС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠ»Π° ΠΎΠ΄ Ρ‡Π΅Ρ‚Π²Ρ€Ρ‚ΠΎΠ³ издања. Али ΠΎΠ²Π΄Π΅ Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π±Π΅Π· ΠΈΠΊΠ°ΠΊΠ²Π΅ јавнС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅, Π΄Π° су Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ Π½Π΅ΠΊΠ°Π΄Π° користили Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ΅ ΠΊΠ°ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΈΡ… копија!

Π¨Ρ‚ΠΎ сС Ρ‚ΠΈΡ‡Π΅ ЛАРГ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°, ΠΎΠ½ΠΈ ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Ρ˜Ρƒ ΠΈΠ½ΠΎΠ΄Π΅ застава ЛАРГ, који користи "Π²Π΅Π»ΠΈΠΊΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ Π°Π΄Ρ€Π΅ΡΠΈΡ€Π°ΡšΠ°" Π·Π° ΠΎΠ±Ρ€Π°Π΄Ρƒ ΠΈΠ½Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²ΠΈ Π·Π° ΠΏΠΎΠ΄Ρ€ΡˆΠΊΡƒ Π²Π΅Ρ›ΠΈΠΌ систСмима Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°. ΠŸΠΎΡˆΡ‚ΠΎ јС КСн Ρ€Π΅ΠΊΠ°ΠΎ Π΄Π° јС Π±ΠΎΡ™Π΅ Π΄Π° ΠΈΡ… Π½Π΅ користим, са задовољством Ρ›Ρƒ ΠΌΡƒ Π²Π΅Ρ€ΠΎΠ²Π°Ρ‚ΠΈ Π½Π° Ρ€Π΅Ρ‡.

Π•Π²ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ систСмског ΠΏΠΎΠ·ΠΈΠ²Π° pipe:

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

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

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ јасно ΠΎΠΏΠΈΡΡƒΡ˜Π΅ ΡˆΡ‚Π° сС ΠΎΠ²Π΄Π΅ дСшава. Али Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡšΠ΅ ΠΊΠΎΠ΄Π° нијС Ρ‚Π°ΠΊΠΎ Π»Π°ΠΊΠΎ, Π΄Π΅Π»ΠΎΠΌ Π·Π±ΠΎΠ³ Π½Π°Ρ‡ΠΈΠ½Π° Π½Π° који "струцт корисник ΡƒΒ» ΠΈ рСгистри R0 ΠΈ R1 ΠΏΡ€ΠΎΡΠ»Π΅Ρ’ΡƒΡ˜Ρƒ сС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ систСмског ΠΏΠΎΠ·ΠΈΠ²Π° ΠΈ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π½Π΅ врСдности.

Π₯ајдС Π΄Π° ΠΏΠΎΠΊΡƒΡˆΠ°ΠΌΠΎ са ΠΈΠ°Π»Π»ΠΎΡ†() ставити Π½Π° диск ΠΈΠ½ΠΎΠ΄Π΅ (индСкс Ρ€ΡƒΡ‡ΠΈΡ†Π°), ΠΈ ΡƒΠ· ΠΏΠΎΠΌΠΎΡ› Ρ„Π°Π»Π»ΠΎΡ†() - стави Π΄Π²Π° Ρƒ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Ρƒ Ρ„ΠΈΠ»Π΅. Ако свС ΠΏΡ€ΠΎΡ’Π΅ ΠΊΠ°ΠΊΠΎ Ρ‚Ρ€Π΅Π±Π°, поставићСмо заставицС Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΡ˜Π΅ΠΌΠΎ ΠΎΠ²Π΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ΅ ΠΊΠ°ΠΎ Π΄Π²Π° ΠΊΡ€Π°Ρ˜Π° Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π°, усмСрићСмо ΠΈΡ… Π½Π° исти ΠΈΠ½ΠΎΠ΄Π΅ (Ρ‡ΠΈΡ˜ΠΈ Ρ›Π΅ Π±Ρ€ΠΎΡ˜ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈ Π±ΠΈΡ‚ΠΈ постављСн Π½Π° 2) ΠΈ ΠΎΠ·Π½Π°Ρ‡ΠΈΡ›Π΅ΠΌΠΎ ΠΈΠ½ΠΎΠ΄Π΅ ΠΊΠ°ΠΎ измСњСн ΠΈ Ρƒ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ ΠΏΠ°ΠΆΡšΡƒ Π½Π° Π·Π°Ρ…Ρ‚Π΅Π²Π΅ Π·Π° ја стављам() Ρƒ ΠΏΡƒΡ‚Π°ΡšΠ°ΠΌΠ° Π³Ρ€Π΅ΡˆΠ°ΠΊΠ° Π΄Π° Π±ΠΈ сС смањио Π±Ρ€ΠΎΡ˜ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈ Ρƒ Π½ΠΎΠ²ΠΎΠΌ ΠΈΠ½ΠΎΠ΄Ρƒ.

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

Застава FPIPE, који постављамо ΠΏΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ° Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π°, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡˆΠ΅ понашањС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ Ρ€Π΄Π²Ρ€() Ρƒ сис2.Ρ†ΠΏΠΎΠ·ΠΈΠ²Π°ΡšΠ΅ спСцифичних И/О Ρ€ΡƒΡ‚ΠΈΠ½Π°:

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

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

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

Π—Π°Ρ‚ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° readp() Π² pipe.c Ρ‡ΠΈΡ‚Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ ΠΈΠ· Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π°. Али Π±ΠΎΡ™Π΅ јС ΠΏΡ€Π°Ρ‚ΠΈΡ‚ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ ΠΏΠΎΡ‡Π΅Π²ΡˆΠΈ ΠΎΠ΄ writep(). ΠžΠΏΠ΅Ρ‚, ΠΊΠΎΠ΄ јС постао слоТСнији Π·Π±ΠΎΠ³ ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΡ˜Π° ΠΏΡ€Π΅Π½ΠΎΡˆΠ΅ΡšΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Π°Ρ‚Π°, Π°Π»ΠΈ Π½Π΅ΠΊΠΈ Π΄Π΅Ρ‚Π°Ρ™ΠΈ сС ΠΌΠΎΠ³Ρƒ изоставити.

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

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

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

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

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

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

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

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

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

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

Π–Π΅Π»ΠΈΠΌΠΎ Π΄Π° ΡƒΠΏΠΈΡˆΠ΅ΠΌΠΎ Π±Π°Ρ˜Ρ‚ΠΎΠ²Π΅ Π½Π° ΡƒΠ»Π°Π· Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π° u.u_count. ΠŸΡ€Π²ΠΎ ΠΌΠΎΡ€Π°ΠΌΠΎ Π΄Π° Π·Π°ΠΊΡ™ΡƒΡ‡Π°ΠΌΠΎ ΠΈΠ½ΠΎΠ΄Π΅ (ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ˜Ρ‚Π΅ Π΄ΠΎΠ»Π΅ plock/prele).

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

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

Ако Ρƒ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Ρƒ ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΡ™Π½ΠΎ слободног простора, ΠΎΠ½Π΄Π° Ρƒ њСга ΡƒΠΏΠΈΡΡƒΡ˜Π΅ΠΌΠΎ ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ користСћи пиши(). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π°Ρ€ i_size1 ΠΈΠ½ΠΎΠ΄Π΅ (Π°ΠΊΠΎ јС Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ ΠΏΡ€Π°Π·Π°Π½, ΠΌΠΎΠΆΠ΅ Π±ΠΈΡ‚ΠΈ јСднак 0) ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° ΠΊΡ€Π°Ρ˜ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° којС Π²Π΅Ρ› садрТи. Ако ΠΈΠΌΠ° Π΄ΠΎΠ²ΠΎΡ™Π½ΠΎ простора Π·Π° снимањС, ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° Π½Π°ΠΏΡƒΠ½ΠΈΠΌΠΎ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ ΠΈΠ· i_size1 Π΄ΠΎ PIPESIZ. Π—Π°Ρ‚ΠΈΠΌ ΠΎΡ‚ΠΏΡƒΡˆΡ‚Π°ΠΌΠΎ Π·Π°ΠΊΡ™ΡƒΡ‡Π°Π²Π°ΡšΠ΅ ΠΈ ΠΏΠΎΠΊΡƒΡˆΠ°Π²Π°ΠΌΠΎ Π΄Π° ΠΏΡ€ΠΎΠ±ΡƒΠ΄ΠΈΠΌΠΎ Π±ΠΈΠ»ΠΎ који процСс који Ρ‡Π΅ΠΊΠ° Π½Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ са Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π°. Π’Ρ€Π°Ρ›Π°ΠΌΠΎ сС Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚Π°ΠΊ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠΎ Π΄Π° Π»ΠΈ смо Ρƒ ΡΡ‚Π°ΡšΡƒ Π΄Π° запишСмо ΠΎΠ½ΠΎΠ»ΠΈΠΊΠΎ Π±Π°Ρ˜Ρ‚ΠΎΠ²Π° ΠΊΠΎΠ»ΠΈΠΊΠΎ Π½Π°ΠΌ јС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ. Ако Π½Π΅ успС, ΠΏΠΎΡ‡ΠΈΡšΠ΅ΠΌΠΎ Π½ΠΎΠ²ΠΈ циклус снимања.

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

ΠŸΡ€Π°Π²Π° магија сС дСшава Ρƒ sleep() ΠΈ wakeup(). Они сС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ˜Ρƒ Ρƒ слп.Ρ†, ΠΈΠ·Π²ΠΎΡ€ Ρ‡ΡƒΠ²Π΅Π½ΠΎΠ³ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€Π° β€žΠΠ΅ ΠΎΡ‡Π΅ΠΊΡƒΡ˜Π΅ сС Π΄Π° ΠΎΠ²ΠΎ Ρ€Π°Π·ΡƒΠΌΠ΅Ρ‚Π΅β€œ. Π‘Ρ€Π΅Ρ›ΠΎΠΌ, Π½Π΅ ΠΌΠΎΡ€Π°ΠΌΠΎ Π΄Π° Ρ€Π°Π·ΡƒΠΌΠ΅ΠΌΠΎ ΠΊΠΎΠ΄, само ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ˜Ρ‚Π΅ Π½Π΅ΠΊΠ΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€Π΅:

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

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

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

Π‘Π°Π΄Π° ΠΈΠΌΠ°ΠΌΠΎ свС Π΄Π° Ρ€Π°Π·ΡƒΠΌΠ΅ΠΌΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Ρƒ readp():

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

    rp = fp;
    ip = rp->f_inode;

loop:
    /* Very conservative locking. */

    plock(ip);

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

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

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

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

    /* Read and return */

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

МоТда Ρ›Π΅ Π²Π°ΠΌ Π±ΠΈΡ‚ΠΈ лакшС Π΄Π° Ρ‡ΠΈΡ‚Π°Ρ‚Π΅ ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Ρƒ ΠΎΠ΄ΠΎΠ·Π΄ΠΎ ΠΏΡ€Π΅ΠΌΠ° Π³ΠΎΡ€Π΅. Π“Ρ€Π°Π½Π° "Ρ‡ΠΈΡ‚Π°Ρ˜ ΠΈ Π²Ρ€Π°Ρ›Π°Ρ˜" сС ΠΎΠ±ΠΈΡ‡Π½ΠΎ користи ΠΊΠ°Π΄Π° ΠΏΠΎΡΡ‚ΠΎΡ˜Π΅ Π½Π΅ΠΊΠΈ ΠΏΠΎΠ΄Π°Ρ†ΠΈ Ρƒ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Ρƒ. Π£ ΠΎΠ²ΠΎΠΌ ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ користимо Ρ€Π΅Π°Π΄ΠΈ() Ρ‡ΠΈΡ‚Π°ΠΌΠΎ ΠΎΠ½ΠΎΠ»ΠΈΠΊΠΎ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠΊΠΎΠ»ΠΈΠΊΠΎ јС доступно ΠΏΠΎΡ‡Π΅Π²ΡˆΠΈ ΠΎΠ΄ Ρ‚Ρ€Π΅Π½ΡƒΡ‚Π½ΠΎΠ³ f_offset Ρ‡ΠΈΡ‚Π°ΡšΠ΅, Π° Π·Π°Ρ‚ΠΈΠΌ Π°ΠΆΡƒΡ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ врСдност ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π°Ρ˜ΡƒΡ›Π΅Π³ офсСта.

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

Ако Π½Π΅ΠΌΠ°Ρ‚Π΅ ΡˆΡ‚Π° Π΄Π° Ρ‡ΠΈΡ‚Π°Ρ‚Π΅, ΠΎΠ½Π΄Π° readp() ΠΌΠΎΠΆΠ΅ поставити заставу IREAD ΠΈ заспати Π΄Π°Ρ™Π΅ ip+2. Π—Π½Π°ΠΌΠΎ ΡˆΡ‚Π° Ρ›Π΅ Π³Π° ΠΏΡ€ΠΎΠ±ΡƒΠ΄ΠΈΡ‚ΠΈ writep(), ΠΊΠ°Π΄Π° ΡƒΠΏΠΈΡΡƒΡ˜Π΅ Π½Π΅ΠΊΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Ρƒ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄.

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ Π½Π° Ρ€Π΅Π°Π΄ΠΈ() ΠΈ Π²Ρ€ΠΈΡ‚Π΅ΠΈ() Ρ›Π΅ Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΡ›ΠΈ Π΄Π° Ρ€Π°Π·ΡƒΠΌΠ΅Ρ‚Π΅ Π΄Π° умСсто Π΄Π° ΠΏΡ€ΠΎΡΠ»Π΅Ρ’ΡƒΡ˜Π΅Ρ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ ΠΏΡ€Π΅ΠΊΠΎ "uβ€žΠœΠΎΠΆΠ΅ΠΌΠΎ ΠΈΡ… Ρ‚Ρ€Π΅Ρ‚ΠΈΡ€Π°Ρ‚ΠΈ ΠΊΠ°ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»Π½Π΅ И/О Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ којС ΡƒΠ·ΠΈΠΌΠ°Ρ˜Ρƒ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΡƒ, ΠΏΠΎΠ·ΠΈΡ†ΠΈΡ˜Ρƒ, Π±Π°Ρ„Π΅Ρ€ Ρƒ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜ΠΈ ΠΈ Π±Ρ€ΠΎΡ˜Π΅ Π±Ρ€ΠΎΡ˜ Π±Π°Ρ˜Ρ‚ΠΎΠ²Π° Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΈΠ»ΠΈ писањС.

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

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

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

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

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

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

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

Π£ ΠΏΠΎΡ‡Π΅Ρ‚ΠΊΡƒ нисам ΠΌΠΎΠ³Π°ΠΎ Π΄Π° схватим Π·Π°ΡˆΡ‚ΠΎ readp() Π½Π΅ ΠΈΠ·Π°Π·ΠΈΠ²Π° prele(ip) ΠΏΡ€Π΅ ΠΏΠΎΠ·ΠΈΠ²Π° wakeup(ip+1). ΠŸΡ€Π²Π° ствар јС writep() ΡƒΠ·Ρ€ΠΎΠΊΡƒΡ˜Π΅ Ρƒ свом циклусу, ΠΎΠ²ΠΎ plock(ip), ΡˆΡ‚ΠΎ Π΄ΠΎΠ²ΠΎΠ΄ΠΈ Π΄ΠΎ Π·Π°ΡΡ‚ΠΎΡ˜Π° Π°ΠΊΠΎ readp() још нисам ΡƒΠΊΠ»ΠΎΠ½ΠΈΠΎ мој Π±Π»ΠΎΠΊ, Ρ‚Π°ΠΊΠΎ Π΄Π° Π½Π΅ΠΊΠ°ΠΊΠΎ ΠΊΠΎΠ΄ ΠΌΠΎΡ€Π° Π΄Π° Ρ€Π°Π΄ΠΈ исправно. Ако ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ‚Π΅ wakeup(), ΠΎΠ½Π΄Π° ΠΏΠΎΡΡ‚Π°Ρ˜Π΅ јасно Π΄Π° само ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° процСс спавања ΠΊΠ°ΠΎ спрСман Π·Π° ΠΈΠ·Π²Ρ€ΡˆΠ΅ΡšΠ΅, Ρ‚Π°ΠΊΠΎ Π΄Π° Ρƒ будућности sched() заиста Π³Π° ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΠΎ. Π’Π°ΠΊΠΎ readp() ΡƒΠ·Ρ€ΠΎΠΊΠ° wakeup(), ΡƒΠΊΠ»Π°ΡšΠ° Π±Ρ€Π°Π²Ρƒ, поставља IREAD ΠΈ ΠΏΠΎΠ·ΠΈΠ²Π° sleep(ip+2)- свС ΠΎΠ²ΠΎ ΠΏΡ€Π΅ writep() наставља циклус.

Овим јС Π·Π°Π²Ρ€ΡˆΠ΅Π½ опис транспортСра Ρƒ ΡˆΠ΅ΡΡ‚ΠΎΠΌ ΠΈΠ·Π΄Π°ΡšΡƒ. ΠˆΠ΅Π΄Π½ΠΎΡΡ‚Π°Π²Π°Π½ ΠΊΠΎΠ΄, далСкосСТнС послСдицС.

Π‘Π΅Π΄ΠΌΠΎ издањС Π£Π½ΠΈΠΊΠ° (Ρ˜Π°Π½ΡƒΠ°Ρ€ 1979.) јС Π±ΠΈΠ»ΠΎ Π½ΠΎΠ²ΠΎ Π²Π΅Π»ΠΈΠΊΠΎ издањС (Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Π³ΠΎΠ΄ΠΈΠ½Π΅ каснијС) којС јС ΡƒΠ²Π΅Π»ΠΎ ΠΌΠ½ΠΎΠ³Π΅ Π½ΠΎΠ²Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅ ΠΈ карактСристикС ΠΊΠ΅Ρ€Π½Π΅Π»Π°. Π’Π°ΠΊΠΎΡ’Π΅ јС ΠΏΡ€Π΅Ρ‚Ρ€ΠΏΠ΅ΠΎ Π·Π½Π°Ρ‡Π°Ρ˜Π½Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅ Ρƒ Π²Π΅Π·ΠΈ са ΠΊΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ΅ΠΌ ливСња Ρ‚ΠΈΠΏΠ°, спојСва ΠΈ ΠΊΡƒΡ†Π°Π½ΠΈΡ… ΠΏΠΎΠΊΠ°Π·ΠΈΠ²Π°Ρ‡Π° Π½Π° структурС. ΠœΠ΅Ρ’ΡƒΡ‚ΠΈΠΌ ΠΊΠΎΠ΄ транспортСра ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½ΠΎ Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅ΡšΠ΅Π½Π°. МоТСмо прСскочити ΠΎΠ²ΠΎ издањС.

Ксв6, Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎ Ρ˜Π΅Π·Π³Ρ€ΠΎ слично Π£Π½ΠΈΠΊΡƒ

Π—Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ ΠΊΠ΅Ρ€Π½Π΅Π»Π° Ксв6 ΠΏΠΎΠ΄ ΡƒΡ‚ΠΈΡ†Π°Ρ˜Π΅ΠΌ ΡˆΠ΅ΡΡ‚ΠΎΠ³ издања Π£Π½ΠΈΠΊ-Π°, Π°Π»ΠΈ јС написано Ρƒ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΎΠΌ Π¦-Ρƒ Π΄Π° Ρ€Π°Π΄ΠΈ Π½Π° ΠΊ86 процСсорима. Код јС Π»Π°ΠΊ Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅ ΠΈ Ρ€Π°Π·ΡƒΠΌΡ™ΠΈΠ². ΠŸΠ»ΡƒΡ, Π·Π° Ρ€Π°Π·Π»ΠΈΠΊΡƒ ΠΎΠ΄ Π£Π½ΠΈΠΊ ΠΈΠ·Π²ΠΎΡ€Π° са Π’Π£Π₯Π‘-ΠΎΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π° ΠΊΠΎΠΌΠΏΠ°Ρ˜Π»ΠΈΡ€Π°Ρ‚ΠΈ, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠΎΠ²Π°Ρ‚ΠΈ ΠΈ ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚ΠΈ Π½Π° Π½Π΅Ρ‡Π΅ΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌ осим Π½Π° ΠŸΠ”ΠŸ 11/70. Π—Π±ΠΎΠ³ Ρ‚ΠΎΠ³Π° сС ΠΎΠ²ΠΎ Ρ˜Π΅Π·Π³Ρ€ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎ користи Π½Π° ΡƒΠ½ΠΈΠ²Π΅Ρ€Π·ΠΈΡ‚Π΅Ρ‚ΠΈΠΌΠ° ΠΊΠ°ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π½ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π» ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΌ систСмима. Π˜Π·Π²ΠΎΡ€ΠΈ су Π½Π° Π“ΠΈΡ‚Ρ…ΡƒΠ±-Ρƒ.

Код садрТи Ρ˜Π°ΡΠ½Ρƒ ΠΈ ΠΏΡ€ΠΎΠΌΠΈΡˆΡ™Π΅Π½Ρƒ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ Ρ†Π΅Π².Ρ†, ΠΏΠΎΠ΄Ρ€ΠΆΠ°Π½ Π±Π°Ρ„Π΅Ρ€ΠΎΠΌ Ρƒ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜ΠΈ умСсто ΠΈΠ½ΠΎΠ΄ΠΎΠΌ Π½Π° диску. ОвдС дајСм само Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΡ˜Ρƒ "структурног Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π°" ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ pipealloc():

#define PIPESIZE 512

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

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

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

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

pipealloc() поставља ΡΡ‚Π°ΡšΠ΅ остатка ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅, ΡˆΡ‚ΠΎ ΡƒΠΊΡ™ΡƒΡ‡ΡƒΡ˜Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ piperead(), pipewrite() ΠΈ pipeclose(). Π‘Ρ‚Π²Π°Ρ€Π½ΠΈ систСмски ΠΏΠΎΠ·ΠΈΠ² sys_pipe јС ΠΎΠΌΠΎΡ‚Π°Ρ‡ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ Ρƒ сисфилС.Ρ†. ΠŸΡ€Π΅ΠΏΠΎΡ€ΡƒΡ‡ΡƒΡ˜Π΅ΠΌ Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ Ρ†Π΅ΠΎ њСгов ΠΊΠΎΠ΄. БлоТСност јС Π½Π° Π½ΠΈΠ²ΠΎΡƒ ΠΈΠ·Π²ΠΎΡ€Π½ΠΎΠ³ ΠΊΠΎΠ΄Π° ΡˆΠ΅ΡΡ‚ΠΎΠ³ издања, Π°Π»ΠΈ јС ΠΌΠ½ΠΎΠ³ΠΎ лакша ΠΈ ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π½ΠΈΡ˜Π° Π·Π° Ρ‡ΠΈΡ‚Π°ΡšΠ΅.

Π›ΠΈΠ½ΡƒΠΊ КБНУМКБ

МоТС сС ΠΏΡ€ΠΎΠ½Π°Ρ›ΠΈ ΠΈΠ·Π²ΠΎΡ€Π½ΠΈ ΠΊΠΎΠ΄ Π›ΠΈΠ½ΡƒΠΊ 0.01. Π‘ΠΈΡ›Π΅ ΠΏΠΎΡƒΡ‡Π½ΠΎ ΠΏΡ€ΠΎΡƒΡ‡ΠΈΡ‚ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π° Ρƒ њСговом fs/pipe.c. Ово користи ΠΈΠ½ΠΎΠ΄Π΅ Π·Π° ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Ρ™Π°ΡšΠ΅ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π°, Π°Π»ΠΈ сам Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ јС написан Ρƒ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΎΠΌ Π¦. Ако стС Ρ€Π°Π΄ΠΈΠ»ΠΈ свој ΠΏΡƒΡ‚ ΠΊΡ€ΠΎΠ· ΠΊΠΎΠ΄ XNUMX. издања, ΠΎΠ²Π΄Π΅ Π½Π΅Ρ›Π΅Ρ‚Π΅ ΠΈΠΌΠ°Ρ‚ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Овако ΠΈΠ·Π³Π»Π΅Π΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° write_pipe():

int write_pipe(struct m_inode * inode, char * buf, int count)
{
    char * b=buf;

    wake_up(&inode->i_wait);
    if (inode->i_count != 2) { /* no readers */
        current->signal |= (1<<(SIGPIPE-1));
        return -1;
    }
    while (count-->0) {
        while (PIPE_FULL(*inode)) {
            wake_up(&inode->i_wait);
            if (inode->i_count != 2) {
                current->signal |= (1<<(SIGPIPE-1));
                return b-buf;
            }
            sleep_on(&inode->i_wait);
        }
        ((char *)inode->i_size)[PIPE_HEAD(*inode)] =
            get_fs_byte(b++);
        INC_PIPE( PIPE_HEAD(*inode) );
        wake_up(&inode->i_wait);
    }
    wake_up(&inode->i_wait);
    return b-buf;
}

Π§Π°ΠΊ ΠΈ Π½Π΅ Π³Π»Π΅Π΄Π°Ρ˜ΡƒΡ›ΠΈ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π΅ структурС, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ схватити ΠΊΠ°ΠΊΠΎ сС Π±Ρ€ΠΎΡ˜ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈ ΠΈΠ½ΠΎΠ΄Π° користи Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€Ρƒ Π΄Π° Π»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π° писања Ρ€Π΅Π·ΡƒΠ»Ρ‚ΠΈΡ€Π° SIGPIPE. ΠŸΠΎΡ€Π΅Π΄ Ρ€Π°Π΄Π° Π±Π°Ρ˜Ρ‚ ΠΏΠΎ Π±Π°Ρ˜Ρ‚, ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Ρƒ јС Π»Π°ΠΊΠΎ ΡƒΠΏΠΎΡ€Π΅Π΄ΠΈΡ‚ΠΈ са Π³ΠΎΡ€Π΅ описаним идСјама. Π§Π°ΠΊ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° sleep_on/wake_up Π½Π΅ ΠΈΠ·Π³Π»Π΅Π΄Π° Ρ‚Π°ΠΊΠΎ страно.

ΠœΠΎΠ΄Π΅Ρ€Π½ΠΈ Π›ΠΈΠ½ΡƒΠΊ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΈ, Π€Ρ€Π΅Π΅Π‘Π‘Π”, НСтББД, ΠžΠΏΠ΅Π½Π‘Π‘Π”

Π‘Ρ€Π·ΠΎ сам ΠΏΡ€ΠΎΡˆΠ°ΠΎ ΠΊΡ€ΠΎΠ· Π½Π΅ΠΊΠ΅ ΠΌΠΎΠ΄Π΅Ρ€Π½Π΅ ΠΊΠ΅Ρ€Π½Π΅Π»Π΅. Нико ΠΎΠ΄ ΡšΠΈΡ… вишС Π½Π΅ΠΌΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ диска (нијС ΠΈΠ·Π½Π΅Π½Π°Ρ’ΡƒΡ˜ΡƒΡ›Π΅). Π›ΠΈΠ½ΡƒΠΊ ΠΈΠΌΠ° ΡΠ²ΠΎΡ˜Ρƒ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ. Иако Ρ‚Ρ€ΠΈ ΠΌΠΎΠ΄Π΅Ρ€Π½Π° Π‘Π‘Π” Ρ˜Π΅Π·Π³Ρ€Π° садрТС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π΅ заснованС Π½Π° ΠΊΠΎΠ΄Ρƒ који јС написао Џон Π”Π°Ρ˜ΡΠΎΠ½, Ρ‚ΠΎΠΊΠΎΠΌ Π³ΠΎΠ΄ΠΈΠ½Π° су постали ΠΏΡ€Π΅Π²ΠΈΡˆΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΠΈ јСдан ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΎΠ³.

Π§ΠΈΡ‚Π°Ρ‚ΠΈ fs/pipe.c (Π½Π° Π›ΠΈΠ½ΡƒΠΊ-Ρƒ) ΠΈΠ»ΠΈ sys/kern/sys_pipe.c (Π½Π° *Π‘Π‘Π”), ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° јС ΠΏΡ€Π°Π²Π° посвСћСност. Π”Π°Π½Π°ΡˆΡšΠΈ ΠΊΠΎΠ΄ сС односи Π½Π° пСрформансС ΠΈ ΠΏΠΎΠ΄Ρ€ΡˆΠΊΡƒ Π·Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ ΠΊΠ°ΠΎ ΡˆΡ‚ΠΎ су вСкторски ΠΈ асинхрони И/О. А Π΄Π΅Ρ‚Π°Ρ™ΠΈ расподСлС ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π΅, Π·Π°ΠΊΡ™ΡƒΡ‡Π°Π²Π°ΡšΠ° ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π΅ ΠΊΠ΅Ρ€Π½Π΅Π»Π° Π²Π΅ΠΎΠΌΠ° сС Ρ€Π°Π·Π»ΠΈΠΊΡƒΡ˜Ρƒ. Ово нијС ΠΎΠ½ΠΎ ΡˆΡ‚ΠΎ јС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ колСџима Π·Π° ΡƒΠ²ΠΎΠ΄Π½ΠΈ курс ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΡ… систСма.

Π£ сваком ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ, Π±ΠΈΠΎ сам заинтСрСсован Π΄Π° ископам Π½Π΅ΠΊΠ΅ старС обрасцС (ΠΊΠ°ΠΎ ΡˆΡ‚ΠΎ јС Π³Π΅Π½Π΅Ρ€ΠΈΡΠ°ΡšΠ΅ SIGPIPE ΠΈ ΠΏΠΎΠ²Ρ€Π°Ρ‚Π°ΠΊ EPIPE ΠΏΡ€ΠΈ ΠΏΠΈΡΠ°ΡšΡƒ Ρƒ Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄) Ρƒ свим ΠΎΠ²ΠΈΠΌ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΠΈΠΌ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠΌ Ρ˜Π΅Π·Π³Ρ€ΠΈΠΌΠ°. Π’Π΅Ρ€ΠΎΠ²Π°Ρ‚Π½ΠΎ Π½ΠΈΠΊΠ°Π΄Π° Π½Π΅Ρ›Ρƒ Π²ΠΈΠ΄Π΅Ρ‚ΠΈ Ρ€Π°Ρ‡ΡƒΠ½Π°Ρ€ ΠŸΠ”ΠŸ-11 Ρƒ стварном ΠΆΠΈΠ²ΠΎΡ‚Ρƒ, Π°Π»ΠΈ још ΡƒΠ²Π΅ΠΊ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚ΠΎΠ³Π° Π΄Π° сС Π½Π°ΡƒΡ‡ΠΈ ΠΈΠ· ΠΊΠΎΠ΄Π° који јС написан Π³ΠΎΠ΄ΠΈΠ½Π°ΠΌΠ° ΠΏΡ€Π΅ ΠΌΠΎΠ³ Ρ€ΠΎΡ’Π΅ΡšΠ°.

Π§Π»Π°Π½Π°ΠΊ који јС написао Π”ΠΈΠ²ΠΈ ΠšΠ°ΠΏΠΎΠΎΡ€ 2011:Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Ρ†Π΅Π²ΠΈ ΠΈ ЀИЀО-ΠΎΠ²Π° Π›ΠΈΠ½ΡƒΠΊ ΠΊΠ΅Ρ€Π½Π΅Π»Π°" ΠΏΡ€ΡƒΠΆΠ° ΠΏΡ€Π΅Π³Π»Π΅Π΄ ΠΊΠ°ΠΊΠΎ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ (још ΡƒΠ²Π΅ΠΊ) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡˆΡƒ Ρƒ Π›ΠΈΠ½ΡƒΠΊ-Ρƒ. А Π½Π΅Π΄Π°Π²Π½ΠΎ ΡƒΡ€Π΅Π·ΠΈΠ²Π°ΡšΠ΅ Ρƒ Π›ΠΈΠ½ΡƒΠΊΡƒ ΠΈΠ»ΡƒΡΡ‚Ρ€ΡƒΡ˜Π΅ Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄Π½ΠΈ ΠΌΠΎΠ΄Π΅Π» ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π΅, Ρ‡ΠΈΡ˜Π΅ могућности ΠΏΡ€Π΅Π²Π°Π·ΠΈΠ»Π°Π·Π΅ ΠΎΠ½Π΅ ΠΏΡ€ΠΈΠ²Ρ€Π΅ΠΌΠ΅Π½ΠΈΡ… Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°; ΠΈ Ρ‚Π°ΠΊΠΎΡ’Π΅ ΠΏΠΎΠΊΠ°Π·ΡƒΡ˜Π΅ ΠΊΠΎΠ»ΠΈΠΊΠΎ су Ρ†Π΅Π²ΠΎΠ²ΠΎΠ΄ΠΈ ΠΎΡ‚ΠΈΡˆΠ»ΠΈ ​​од "Π²Π΅ΠΎΠΌΠ° ΠΊΠΎΠ½Π·Π΅Ρ€Π²Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ Π·Π°ΠΊΡ™ΡƒΡ‡Π°Π²Π°ΡšΠ°" ΡˆΠ΅ΡΡ‚ΠΎΠ³ издања Π£Π½ΠΈΠΊ ΠΊΠ΅Ρ€Π½Π΅Π»Π°.

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

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