Как са Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ Π² Unix

Как са Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ Π² Unix
Π’ Ρ‚Π°Π·ΠΈ статия Π΅ описана рСализация Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ Π² ядрото Π½Π° Unix. Бях ΠΌΠ°Π»ΠΊΠΎ Ρ€Π°Π·ΠΎΡ‡Π°Ρ€ΠΎΠ²Π°Π½, Ρ‡Π΅ наскоро ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π°Ρ‚Π° статия с ΠΈΠΌΠ΅Ρ‚ΠΎ β€žΠšΠ°ΠΊ работят ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ Π² Unix?β€œ сС ΠΎΠΊΠ°Π·Π° Π½Π΅ Π·Π° Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½Π°Ρ‚Π° структура. ЗаинтСрСсувах сС ΠΈ ΠΊΠΎΠΏΠ½Π°Ρ… Π² стари ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ, Π·Π° Π΄Π° намСря ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π°.

Π—Π° ΠΊΠ°ΠΊΠ²ΠΎ става Π΄ΡƒΠΌΠ°?

ΠšΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ β€” β€žΠ²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½ΠΈΠ΅ Π² Unixβ€œ β€” са опрСдСляща характСристика Π½Π° основната философия Π½Π° Unix Π·Π° обСдиняванС Π½Π° ΠΌΠ°Π»ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, Π° ΡΡŠΡ‰ΠΎ ΠΈ ΠΏΠΎΠ·Π½Π°Ρ‚Π°Ρ‚Π° надпис Π² командния Ρ€Π΅Π΄:

$ echo hello | wc -c
6

Π’Π°Π·ΠΈ функционалност зависи ΠΎΡ‚ систСмния ΠΏΠΎΠ²ΠΈΠΊ, прСдоставСн ΠΎΡ‚ ядрото, pipeΠΊΠΎΠΉΡ‚ΠΎ Π΅ описан Π² докумСнтацията Π½Π° pipe(7) ΠΈ pipe(2):

ΠšΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ прСдоставят СднопосочСн ΠΊΠ°Π½Π°Π» Π·Π° мСТдупроцСсно взаимодСйствиС. ΠšΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΡŠΡ‚ ΠΈΠΌΠ° Π²Ρ…ΠΎΠ΄ (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) трябва Π΄Π° бъдС Π°Ρ‚ΠΎΠΌΠ°Ρ€Π΅Π½, Π·Π° Π΄Π° ΠΌΠΎΠ³Π°Ρ‚ процСситС Π΄Π° взаимодСйстват ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρƒ си Ρ‡Ρ€Π΅Π· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΏΠΎ Π½Π°Ρ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ (ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ прСдоставят Ρ‚Π°ΠΊΠΈΠ²Π° Π³Π°Ρ€Π°Π½Ρ†ΠΈΠΈ) Π½Π΅ ΠΌΠΎΠ³Π°Ρ‚.

ΠŸΡ€ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° запишС всичкитС си ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ Π΄Π° Π³ΠΈ ΠΏΡ€Π΅Π΄Π°Π΄Π΅ Π½Π° Π΄Ρ€ΡƒΠ³ процСс. Или процСситС ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° дСйстват Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° строга паралСлност, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ външСн сигналСн ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ (ΠΊΠ°Ρ‚ΠΎ сСмафор), Π·Π° Π΄Π° увСдомят Π΅Π΄ΠΈΠ½ Π΄Ρ€ΡƒΠ³ Π·Π° ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° записванСто ΠΈΠ»ΠΈ Ρ‡Π΅Ρ‚Π΅Π½Π΅Ρ‚ΠΎ. ΠšΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ Π½ΠΈ освобоТдават ΠΎΡ‚ всичкитС Ρ‚Π΅Π·ΠΈ затруднСния.

Какво Ρ‚ΡŠΡ€ΡΠΈΠΌ?

Π©Π΅ обясня Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ, Π·Π° Π΄Π° Π²ΠΈ Π΅ ΠΏΠΎ-лСсно Π΄Π° си прСдставитС ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΡŠΡ‚. Π©Π΅ Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π±ΡƒΡ„Π΅Ρ€ Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΠΈ някакво ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅. Π©Π΅ са Π½ΡƒΠΆΠ½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° добавянС ΠΈ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ Π±ΡƒΡ„Π΅Ρ€Π°. НуТСн Π΅ ΠΈ инструмСнт, ΠΊΠΎΠΉΡ‚ΠΎ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΈ запис Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈΡ‚Π΅ дСскриптори. И Ρ‰Π΅ са Π½ΡƒΠΆΠ½ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π·Π° Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ спомСнатото Π³ΠΎΡ€Π΅ спСцифично ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Π‘Π΅Π³Π° смС Π³ΠΎΡ‚ΠΎΠ²ΠΈ Π΄Π° изслСдвамС ΠΏΡ€ΠΈ ярка свСтлина Π»Π°ΠΌΠΏΠΈΡ‚Π΅ изходния ΠΊΠΎΠ΄ Π½Π° ядрото, Π·Π° Π΄Π° ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄ΠΈΠΌ ΠΈΠ»ΠΈ ΠΎΠΏΡ€ΠΎΠ²Π΅Ρ€Π³Π°Π΅ΠΌ Π½Π°ΡˆΠ°Ρ‚Π° нСясна умствСна ΠΌΠΎΠ΄Π΅Π». Но Π²ΠΈΠ½Π°Π³ΠΈ Π±ΡŠΠ΄Π΅Ρ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈ Π·Π° ΠΈΠ·Π½Π΅Π½Π°Π΄ΠΈ.

КъдС Ρ‚ΡŠΡ€ΡΠΈΠΌ?

НС Π·Π½Π°ΠΌ къдС сС Π½Π°ΠΌΠΈΡ€Π° моят СкзСмпляр Π½Π° извСстната ΠΊΠ½ΠΈΠ³Π° "Lions book" с изходния ΠΊΠΎΠ΄ Π½Π° Unix 6, Π½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° The Unix Heritage Society ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΡ‚ΡŠΡ€ΡΠΈΠΌ ΠΎΠ½Π»Π°ΠΉΠ½ Π² изходния ΠΊΠΎΠ΄ Π½Π° ΠΎΡ‰Π΅ ΠΏΠΎ-старитС вСрсии Π½Π° Unix.

Π‘Π»ΡƒΠΆΠ΄Π°Π΅Π½Π΅Ρ‚ΠΎ ΠΈΠ· Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ‚Π΅ Π½Π° TUHS Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° посСщСниС Π½Π° ΠΌΡƒΠ·Π΅ΠΉ. МоТСм Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ Π² Π½Π°ΡˆΠ°Ρ‚Π° ΠΎΠ±Ρ‰Π° история ΠΈ чувствам рСспСкт към ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎΠ΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ усилия Π·Π° Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ Π½Π° всички Ρ‚Π΅Π·ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈ Π±ΠΈΡ‚ ΠΏΠΎ Π±ΠΈΡ‚ ΠΎΡ‚ стари касСтки ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ. И остра осъзнавам липсващитС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈ.

УдовлСтворявайки Π»ΡŽΠ±ΠΎΠΏΠΈΡ‚ΡΡ‚Π²ΠΎΡ‚ΠΎ си относно Π΄Ρ€Π΅Π²Π½Π°Ρ‚Π° история Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅, ΠΌΠΎΠΆΠ΅ΠΌ Π·Π° сравнСниС Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ Π½Π° ΡΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈΡ‚Π΅ ядра.

ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, pipe Π΅ систСмСн ΠΏΠΎΠ²ΠΈΠΊ Π½ΠΎΠΌΠ΅Ρ€ 42 Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° sysent[]. Блучайност?

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΈ ядра Π½Π° Unix (1970–1974)

НС Π½Π°ΠΌΠ΅Ρ€ΠΈΡ… Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ слСди pipe(2) Π½ΠΈΡ‚ΠΎ Π² PDP-7 Unix (януари 1970 Π³.), Π½ΠΈΡ‚ΠΎ Π² ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix (Π½ΠΎΠ΅ΠΌΠ²Ρ€ΠΈ 1971 Π³.), Π½ΠΈΡ‚ΠΎ Π² нСпълния ΠΈΠ·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (юни 1972 Π³.).

TUHS Ρ‚Π²ΡŠΡ€Π΄ΠΈ, Ρ‡Π΅ Ρ‚Ρ€Π΅Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix (Ρ„Π΅Π²Ρ€ΡƒΠ°Ρ€ΠΈ 1973) бСшС ΠΏΡŠΡ€Π²Π°Ρ‚Π° вСрсия с ΠΊΠ°Π½Π°Π»ΠΈ:

Π’Ρ€Π΅Ρ‚Π°Ρ‚Π° рСдакция Π½Π° Unix бСшС послСдната вСрсия с ядро, написано Π½Π° асСмблСр, Π½ΠΎ ΠΈ ΠΏΡŠΡ€Π²Π°Ρ‚Π° вСрсия с ΠΊΠ°Π½Π°Π»ΠΈ. ΠŸΡ€Π΅Π· 1973 Π³ΠΎΠ΄ΠΈΠ½Π° сС Ρ€Π°Π±ΠΎΡ‚Π΅ΡˆΠ΅ ΠΏΠΎ подобряванС Π½Π° Ρ‚Ρ€Π΅Ρ‚Π°Ρ‚Π° рСдакция, ядро бСшС прСнаписано Π½Π° C, ΠΈ Ρ‚Π°ΠΊΠ° сС появи Ρ‡Π΅Ρ‚Π²ΡŠΡ€Ρ‚Π°Ρ‚Π° вСрсия Π½Π° Unix.

Π•Π΄ΠΈΠ½ ΠΎΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈ скан Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π”Π°Π³ ΠœΠ°ΠΊΠ˜Π»Ρ€ΠΎΠΉ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈ идСята Π·Π° "ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Π½Π° градинския ΠΌΠ°Ρ€ΠΊΡƒΡ‡".

Как са Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ Π² Unix
Π’ ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Π½Π° Π‘Ρ€Π°ΠΉΡŠΠ½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½ "Unix: Π˜ΡΡ‚ΠΎΡ€ΠΈΡ ΠΈ ΠΌΠ΅ΠΌΠΎΠ°Ρ€ΠΈ" ΡΡŠΡ‰ΠΎ сС спомСнава Ρ‚ΠΎΠ·ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚: "... Ρ‚ΠΎΠΉ висСшС Π½Π° стСната Π² офиса ΠΌΠΈ Π² Bell Labs Π² ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° 30 Π³ΠΎΠ΄ΠΈΠ½ΠΈ". Π•Ρ‚ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŽ с ΠœΠ°ΠΊΠ˜Π»Ρ€ΠΎΠΉ, ΠΈ ΠΎΡ‰Π΅ Π΅Π΄Π½Π° история ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠœΠ°ΠΊΠ˜Π»Ρ€ΠΎΠΉ, написана ΠΏΡ€Π΅Π· 2014:

ΠšΠΎΠ³Π°Ρ‚ΠΎ сС появи Unix, моят интСрСс към ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈΡ‚Π΅ ΠΌΠ΅ Π½Π°ΠΊΠ°Ρ€Π° Π΄Π° ΠΏΠΎΠΏΠΈΡ‚Π°ΠΌ Π°Π²Ρ‚ΠΎΡ€Π° Π½Π° ОБ, КСн Вомпсън, Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅, записани Π² някакъв процСс, Π΄Π° ΠΎΡ‚ΠΈΠ²Π°Ρ‚ Π½Π΅ само Π½Π° устройството, Π½ΠΎ ΠΈ Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π° към Π΄Ρ€ΡƒΠ³ процСс. КСн Ρ€Π΅ΡˆΠΈ, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ възмоТно. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, ΠΊΠ°Ρ‚ΠΎ минималист, Ρ‚ΠΎΠΉ искашС всяка систСмна функция Π΄Π° ΠΈΠ³Ρ€Π°Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½Π° роля. Наистина Π»ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎΡ‚ΠΎ записванС ΠΌΠ΅ΠΆΠ΄Ρƒ процСситС Π΅ с голямо прСдимство Π² сравнСниС с записванСто Π² ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π΅Π½ Ρ„Π°ΠΉΠ»? И само ΠΊΠΎΠ³Π°Ρ‚ΠΎ прСдставих ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ "ΠΊΠ°Π½Π°Π»" ΠΈ описаниС Π½Π° синтаксиса Π·Π° взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ процСситС, КСн Π½Π°ΠΉ-накрая възкликна: "Π©Π΅ Π³ΠΎ направя!".

И Ρ‚ΠΎΠΉ Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈ. Π’ Π΅Π΄Π½Π° съдбоносна Π²Π΅Ρ‡Π΅Ρ€ КСн ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ядрото ΠΈ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π°, ΠΏΠΎΠΏΡ€Π°Π²ΠΈ няколко стандартни ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, стандартизирайки тСхния процСс Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° Π²Ρ…ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½ΠΈ (ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠ΄Π²Π°Ρ‚ ΠΎΡ‚ ΠΊΠ°Π½Π°Π»ΠΈ), Π° ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΈΠΌΠ΅Π½Π°Ρ‚Π° Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅. На слСдващия Π΄Π΅Π½ ΠΊΠ°Π½Π°Π»ΠΈΡ‚Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ…Π° Π΄Π° сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎ Π² прилоТСнията. Π”ΠΎ края Π½Π° сСдмицата сСкрСтаркитС Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…Π°, Π·Π° Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈ ΠΎΡ‚ тСкстови Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΈ Π½Π° ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€Π°. Няколко ΠΏΠΎ-късно КСн Π·Π°ΠΌΠ΅Π½ΠΈ оригиналния API ΠΈ синтаксиса Π·Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π° Π½Π° ΠΊΠ°Π½Π°Π»ΠΈ с ΠΏΠΎ-чисти споразумСния, ΠΊΠΎΠΈΡ‚ΠΎ ΠΎΡ‚Ρ‚ΠΎΠ³Π°Π²Π° сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚.

Π—Π° съТалСниС, изходният ΠΊΠΎΠ΄ Π½Π° ядрото Π½Π° Ρ‚Ρ€Π΅Ρ‚Π°Ρ‚Π° рСдакция Π½Π° Unix Π΅ Π·Π°Π³ΡƒΠ±Π΅Π½. И Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ ΠΈΠΌΠ°ΠΌΠ΅ написан Π½Π° C ΠΈΠ·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π½Π° ядрото Π½Π° Ρ‡Π΅Ρ‚Π²ΡŠΡ€Ρ‚Π°Ρ‚Π° рСдакция, която ΠΈΠ·Π»Π΅Π·Π΅ ΠΏΡ€Π΅Π· Π½ΠΎΠ΅ΠΌΠ²Ρ€ΠΈ 1973, тя ΠΈΠ·Π»Π΅Π·Π΅ няколко мСсСца ΠΏΡ€Π΅Π΄ΠΈ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ Π½Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° рСализация Π½Π° ΠΊΠ°Π½Π°Π»ΠΈΡ‚Π΅. Π–Π°Π»ΠΊΠΎ Π΅, Ρ‡Π΅ изходният ΠΊΠΎΠ΄ Π½Π° Π»Π΅Π³Π΅Π½Π΄Π°Ρ€Π½Π°Ρ‚Π° функция Π½Π° Unix Π΅ Π·Π°Π³ΡƒΠ±Π΅Π½, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π·Π°Π²ΠΈΠ½Π°Π³ΠΈ.

ИмамС тСкст Π½Π° докумСнтацията Π·Π° pipe(2) ΠΈ ΠΎΡ‚ Π΄Π²Π΅Ρ‚Π΅ издания, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ с Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π² докумСнтацията Ρ‚Ρ€Π΅Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Π΄ΡƒΠΌΠΈ, ΠΏΠΎΠ΄Ρ‡Π΅Ρ€Ρ‚Π°Π²Π°Π½ΠΈ β€žΡ€ΡŠΡ‡Π½ΠΎβ€œ, Ρ€Π΅Π΄ с Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΈ ^H, слСд ΠΊΠΎΠΉΡ‚ΠΎ слСдва Π΄ΠΎΠ»Π½Π° Ρ‡Π΅Ρ€Ρ‚Π°!). Π’ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏpipe(2) Π΅ написан Π½Π° асСмблСр ΠΈ Π²Ρ€ΡŠΡ‰Π° само Π΅Π΄ΠΈΠ½ Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор, Π½ΠΎ Π²Π΅Ρ‡Π΅ прСдоставя ΠΎΡ‡Π°ΠΊΠ²Π°Π½Π°Ρ‚Π° основна функционалност:

БистСмно ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ pipe създава ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° Π²Ρ…ΠΎΠ΄-ΠΈΠ·Ρ…ΠΎΠ΄, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€. Π’ΡŠΡ€Π½Π°Ρ‚ΠΈΡΡ‚ Ρ„Π°ΠΉΠ»ΠΎΠ² дСскриптор ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΈ писанС. ΠšΠΎΠ³Π°Ρ‚ΠΎ Π½Π΅Ρ‰ΠΎ сС запишС Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°, Ρ‚ΠΎ сС Π±ΡƒΡ„Π΅Ρ€ΠΈΡ€Π° Π΄ΠΎ 504 Π±Π°ΠΉΡ‚Π° Π΄Π°Π½Π½ΠΈ, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° запис сС спира. ΠŸΡ€ΠΈ Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΎΡ‚ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°, Π±ΡƒΡ„Π΅Ρ€ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ сС Π²Π·ΠΈΠΌΠ°Ρ‚.

Π”ΠΎ слСдващата Π³ΠΎΠ΄ΠΈΠ½Π° ядрото бСшС прСзаписано Π½Π° C, Π° pipe(2) Π² Ρ‡Π΅Ρ‚Π²ΡŠΡ€Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ΄ΠΎΠ±ΠΈ ΡΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈΡ си Π²ΠΈΠ΄ с ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° β€žpipe(fildes)Β»:

БистСмно ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ pipe създава ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π·Π° Π²Ρ…ΠΎΠ΄-ΠΈΠ·Ρ…ΠΎΠ΄, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€. Π’ΡŠΡ€Π½Π°Ρ‚ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптори ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΏΡ€ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΈ писанС. ΠšΠΎΠ³Π°Ρ‚ΠΎ Π½Π΅Ρ‰ΠΎ сС записва Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°, сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄Π΅ΡΠΊΡ€ΠΈΠΏΡ‚ΠΎΡ€ΡŠΡ‚, Π²ΡŠΡ€Π½Π°Ρ‚ Π² r1 (ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° Π½Π° fildes[1]), ΠΊΠΎΠΉΡ‚ΠΎ сС Π±ΡƒΡ„Π΅Ρ€ΠΈΡ€Π° Π΄ΠΎ 4096 Π±Π°ΠΉΡ‚Π° Π΄Π°Π½Π½ΠΈ, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° запис сС спира. ΠŸΡ€ΠΈ Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΎΡ‚ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°, Π΄Π΅ΡΠΊΡ€ΠΈΠΏΡ‚ΠΎΡ€ΡŠΡ‚, Π²ΡŠΡ€Π½Π°Ρ‚ Π² r0 (ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° Π½Π° fildes[0]), Π²Π·ΠΈΠΌΠ° Π΄Π°Π½Π½ΠΈ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π° сС, Ρ‡Π΅ слСд опрСдСлянСто Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° Π΄Π²Π° (ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅) взаимодСйствуващи процСса (създадСни ΠΎΡ‚ послСдващи повиквания fork) Ρ‰Π΅ ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° повиквания read ΠΈ write.

Π’ шСл ΠΈΠΌΠ° синтаксис Π·Π° опрСдСлянС Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ΅Π½ масив ΠΎΡ‚ процСси, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ Ρ‡Ρ€Π΅Π· ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€.

ΠŸΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡΡ‚Π° Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΎΡ‚ ΠΏΡ€Π°Π·Π΅Π½ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ (ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Π±ΡƒΡ„Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ Π΄Π°Π½Π½ΠΈ), ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ° само Π΅Π΄ΠΈΠ½ ΠΊΡ€Π°ΠΉ (записващитС Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ дСскриптори са Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈ), Π²Ρ€ΡŠΡ‰Π°Ρ‚ β€žΠΊΡ€Π°ΠΉ Π½Π° Ρ„Π°ΠΉΠ»Π°β€œ. ΠŸΠΎΠ²ΠΈΠΊΠ²Π°Π½ΠΈΡΡ‚Π° Π·Π° запис Π² Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° ситуация сС ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°Ρ‚.

Най-Ρ€Π°Π½Π½Π°Ρ‚Π° оцСляла рСализация Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ сС отнася към ΠΏΠ΅Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Unix (юни 1974 Π³.), Π½ΠΎ Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° Π½Π° Ρ‚Π°Π·ΠΈ, която сС появи Π² слСдващото ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. Π‘Π°ΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ…Π° ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΏΠ΅Ρ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС пропуснС.

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

Π—Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅ Π΄Π° Ρ‡Π΅Ρ‚Π΅ΠΌ изходния ΠΊΠΎΠ΄ Π½Π° Unix ΡˆΠ΅ΡΡ‚ΠΎΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (ΠΌΠ°ΠΉ 1975 Π³.). Π”ΠΎ голяма стСпСн Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Lions Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-лСсно Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΠΎ-Ρ€Π°Π½Π½ΠΈ вСрсии:

Много Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° Lions бСшС СдинствСният Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π·Π° ядрото Π½Π° Unix, Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ извън стСнитС Π½Π° Bell Labs. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ лицСнзията Π½Π° ΡˆΠ΅ΡΡ‚Π°Ρ‚Π° рСдакция позволявашС Π½Π° ΠΏΡ€Π΅ΠΏΠΎΠ΄Π°Π²Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ изходния ΠΊΠΎΠ΄, лицСнзията Π½Π° сСдмата рСдакция ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈ Ρ‚Π°Π·ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚, ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΊΠ½ΠΈΠ³Π°Ρ‚Π° сС Ρ€Π°Π·ΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΠ²Π°ΡˆΠ΅ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° Π½Π΅Π»Π΅Π³Π°Π»Π½ΠΈ машинописни копия.

ДнСс ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°ΠΊΡƒΠΏΠΈΡ‚Π΅ Ρ€Π΅ΠΏΡ€ΠΈΠ½Ρ‚Π½ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° ΠΊΠ½ΠΈΠ³Π°Ρ‚Π°, Π½Π° ΠΊΠΎΡ€ΠΈΡ†Π°Ρ‚Π° Π½Π° която са ΠΈΠ·ΠΎΠ±Ρ€Π°Π·Π΅Π½ΠΈ студСнти ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€Π½Π° машина. А Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° Π£ΠΎΡ€ΡŠΠ½ Π’ΡƒΠΌΠΈ (ΠΊΠΎΠΉΡ‚ΠΎ стартира ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° TUHS) ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΡ‚Π΅ PDF Ρ„Π°ΠΉΠ» с изходния ΠΊΠΎΠ΄ Π½Π° ΡˆΠ΅ΡΡ‚Π°Ρ‚Π° рСдакция. Искам Π΄Π° Π²ΠΈ Π΄Π°ΠΌ прСдстава ΠΊΠΎΠ»ΠΊΠΎ усилия са Π±ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π·Π° ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ»Π°:

ΠŸΡ€Π΅Π΄ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ 15 Π³ΠΎΠ΄ΠΈΠ½ΠΈ написах ΠΊΠΎΠΏΠΈΠ΅ Π½Π° изходния ΠΊΠΎΠ΄, ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ Π² Lions, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π½Π΅ ΠΌΠΈ Ρ…Π°Ρ€Π΅ΡΠ²Π°ΡˆΠ΅ качСството Π½Π° ΠΊΠΎΠΏΠΈΠ΅Ρ‚ΠΎ ΠΌΠΈ ΠΎΡ‚ нСизвСстСн Π±Ρ€ΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΈ копия. 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, ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ‚ Β«Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° Π·Π° голямо адрСсиранС» Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° косвСни (indirect) Π±Π»ΠΎΠΊΠΎΠ²Π΅ с Ρ†Π΅Π» Π΄Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΏΠΎ-Π³ΠΎΠ»Π΅ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΈ систСми. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ КСн ΠΊΠ°Π·Π°, Ρ‡Π΅ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° Π½Π΅ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅, с радост Ρ‰Π΅ ΠΌΡƒ повярвам.

Π•Ρ‚ΠΎ истински систСмСн ΠΏΠΎΠ²ΠΈΠΊ. 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() Π΄Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π½Π° диска inode (индСксСн дСскриптор), Π° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° falloc() β€” Π΄Π° Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π΄Π²Π° Ρ„Π°ΠΉΠ»Π°. Ако всичко ΠΌΠΈΠ½Π΅ Π΄ΠΎΠ±Ρ€Π΅, Ρ‰Π΅ Π·Π°Π΄Π°Π΄Π΅ΠΌ Ρ„Π»Π°Π³ΠΎΠ²Π΅, Π·Π° Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ‚Π΅Π·ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΊΠ°Ρ‚ΠΎ Π΄Π²Π° края Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°, Ρ‰Π΅ Π³ΠΈ посочим Π² ΡΡŠΡ‰ΠΈΡ inode (Ρ‡ΠΈΠΉΡ‚ΠΎ Π±Ρ€ΠΎΠΉ Π½Π° ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‚ΠΊΠΈ Ρ‰Π΅ станС 2) ΠΈ Ρ‰Π΅ ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°ΠΌΠ΅ inode ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½. ΠžΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° обращСнията към iput() Π² Π³Ρ€Π΅ΡˆΠ½ΠΈ ΠΏΡŠΡ‚ΠΈΡ‰Π° (error paths), Π·Π° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΠΌ броя Π½Π° ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‚ΠΊΠΈΡ‚Π΅ Π² новия inode.

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)
{
    Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€ *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.

Но Π΄ΠΎΡ€ΠΈ ΠΈ Π΄Π° Π΅ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½, ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС запълнСн. Π’ Ρ‚ΠΎΠ·ΠΈ случай свалямС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ‚Π° ΠΈ ΠΎΡ‚ΠΈΠ²Π°ΠΌΠ΅ Π΄Π° спим Π² Π½Π°Π΄Π΅ΠΆΠ΄Π°Ρ‚Π°, Ρ‡Π΅ Π΄Ρ€ΡƒΠ³ процСс Ρ‰Π΅ ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅ ΠΎΡ‚ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΈ Ρ‰Π΅ освободи Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ място. Π‘ΡŠΠ±ΡƒΠ΄ΡΠ²Π°ΠΉΠΊΠΈ сС, сС Π²Ρ€ΡŠΡ‰Π°ΠΌΠ΅ Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ, ΠΎΡ‚Π½ΠΎΠ²ΠΎ слагамС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈ стартирамС Π½ΠΎΠ² Ρ†ΠΈΠΊΡŠΠ» Π½Π° запис.

Ако Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΈΠΌΠ° Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ свободно място, записвамС Π΄Π°Π½Π½ΠΈ Ρ‡Ρ€Π΅Π· writei(). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ i_size1 Π½Π° inode-a (Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ Ρ€Π°Π²Π½ΠΎ Π½Π° 0 ΠΏΡ€ΠΈ ΠΏΡ€Π°Π·Π΅Π½ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€) ΡƒΠΊΠ°Π·Π²Π° Π½Π° края Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π²Π΅Ρ‡Π΅ сС ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‚ Π² Π½Π΅Π³ΠΎ. Ако ΠΈΠΌΠ° Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ място Π·Π° запис, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° напълним ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΎΡ‚ i_size1 Π΄ΠΎ PIPESIZ. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° свалямС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°Ρ‚Π° ΠΈ ΠΎΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ Π΄Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π² ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π½Π° будност всСки процСс, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‡Π°ΠΊΠ° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅ ΠΎΡ‚ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°. Π’Ρ€ΡŠΡ‰Π°ΠΌΠ΅ сС Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»ΠΈ смС успСли Π΄Π° запишСм Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π±Π°ΠΉΡ‚ΠΎΠ²Π΅, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π½ΠΈ бяха Π½ΡƒΠΆΠ½ΠΈ. Ако Π½Π΅ успССм, Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅ Π½ΠΎΠ² Ρ†ΠΈΠΊΡŠΠ» Π½Π° запис.

ОбикновСно ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ΡŠΡ‚ i_mode Π½Π° inode-a сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ‚Π° r, w ΠΈ x. Но Π² случая с ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ сигнализирамС Π·Π° ΠΈΠ·Ρ‡Π°ΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ ΠΎΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ процСс, ΠΊΠΎΠΉΡ‚ΠΎ записва ΠΈΠ»ΠΈ Ρ‡Π΅Ρ‚Π΅, с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π±ΠΈΡ‚ΠΎΠ²Π΅Ρ‚Π΅ IREAD ΠΈ IWRITE ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ. ΠŸΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π·Π°Π΄Π°Π²Π° Ρ„Π»Π°Π³Π° ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π° sleep(), ΠΈ сС ΠΎΡ‡Π°ΠΊΠ²Π°, Ρ‡Π΅ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅ Π΄Ρ€ΡƒΠ³ процСс Ρ‰Π΅ ΠΈΠ·Π²ΠΈΠΊΠ° wakeup().

Π˜ΡΡ‚ΠΈΠ½ΡΠΊΠΎΡ‚ΠΎ Ρ‡ΡƒΠ΄ΠΎ сС случва Π² sleep() ΠΈ wakeup(). Π’Π΅ са Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Π² slp.c, ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° знамСнития ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ β€žΠΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π³ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρˆβ€œ (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);
}

МоТС Π΄Π° бъдС ΠΏΠΎ-лСсно Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ Ρ‚Π°Π·ΠΈ функция ΠΎΡ‚Π΄ΠΎΠ»Ρƒ Π½Π°Π³ΠΎΡ€Π΅. Π’Π΅Ρ‚ΠΊΠ°Ρ‚Π° β€žΡ‡Π΅Ρ‚ΠΈ ΠΈ Π²Ρ€ΡŠΡ‰Π°ΠΉβ€œ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° ΠΈΠΌΠ° Π΄Π°Π½Π½ΠΈ. Π’ Ρ‚ΠΎΠ·ΠΈ случай Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° readi() Ρ‡Π΅Ρ‚Π΅ΠΌ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ са Π½Π°Π»ΠΈΡ‡Π½ΠΈ ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΎΡ‚ΠΎ f_offset Ρ‡Π΅Ρ‚Π΅Π½Π΅, Π° слСд Ρ‚ΠΎΠ²Π° обновявамС стойността Π½Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎΡ‚ΠΎ отмСстванС.

ΠŸΡ€ΠΈ слСдващо Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΡŠΡ‚ Ρ‰Π΅ бъдС ΠΏΡ€Π°Π·Π΅Π½, Π°ΠΊΠΎ отмСстванСто Π½Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π΅ достигнало стойността i_size1 Π½Π° inode-Π°. НиС Π½ΡƒΠ»ΠΈΡ€Π°ΠΌΠ΅ позицията ΠΈ сС ΠΎΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ Π΄Π° ΡΡŠΠ±ΡƒΠ΄ΠΈΠΌ всякаква ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, която иска Π΄Π° запишС Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°. НиС Π·Π½Π°Π΅ΠΌ, Ρ‡Π΅ ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΡŠΡ‚ Π΅ пълСн, writep() Ρ‰Π΅ заспи Π½Π° ip+1.А сСга, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΡŠΡ‚ Π΅ ΠΏΡ€Π°Π·Π΅Π½, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π³ΠΎ ΡΡŠΠ±ΡƒΠ΄ΠΈΠΌ, Π·Π° Π΄Π° ΠΏΠΎΠ΄Π½ΠΎΠ²ΠΈ своя Ρ†ΠΈΠΊΡŠΠ» Π½Π° запис.

Ако няма ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° сС Ρ‡Π΅Ρ‚Π΅, Ρ‚ΠΎ readp() ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ Ρ„Π»Π°Π³ IREAD ΠΈ Π΄Π° заспи Π½Π° ip+2.НиС Π·Π½Π°Π΅ΠΌ, Ρ‡Π΅ Ρ‰Π΅ бъдС ΡΡŠΠ±ΡƒΠ΄Π΅Π½ writep(), ΠΊΠΎΠ³Π°Ρ‚ΠΎ запишС някакви Π΄Π°Π½Π½ΠΈ Π² ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π°.

ΠšΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ Π·Π° readi() ΠΈ writei() Ρ‰Π΅ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚ Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π΅, Ρ‡Π΅ вмСсто Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Ρ‡Ρ€Π΅Π· β€ž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() Π΄Π° възобнови Ρ†ΠΈΠΊΡŠΠ»Π°.

Π‘ Ρ‚ΠΎΠ²Π° описаниСто Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ Π² ΡˆΠ΅ΡΡ‚Π° рСдакция Π΅ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ. ΠŸΡ€ΠΎΡΡ‚ ΠΊΠΎΠ΄, Π΄Π°Π»Π΅Ρ‡Π½ΠΈ послСдствия.

Π‘Π΅Π΄ΠΌΠ° рСдакция Π½Π° Unix (януари 1979) бСшС Π½ΠΎΠ²ΠΎ основно ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ (слСд Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Π³ΠΎΠ΄ΠΈΠ½ΠΈ), Π² ΠΊΠΎΠ΅Ρ‚ΠΎ сС появиха ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΈ прилоТСния ΠΈ свойства Π½Π° ядрото. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π² Π½Π΅Π³ΠΎ имашС Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° прСобразувания Π½Π° Ρ‚ΠΈΠΏΠΎΠ²Π΅, union-ΠΈ ΠΈ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° структури. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π° ΠΊΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€ΠΈΡ‚Π΅ практичСски Π½Π΅ сС Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ». МоТСм Π΄Π° пропуснСм Ρ‚ΠΎΠ²Π° ΠΈΠ·Π΄Π°Π½ΠΈΠ΅.

Xv6, просто ядро, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° Unix

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

ΠšΠΎΠ΄ΡŠΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΠ° ΠΈ обмислСна рСализация pipe.c, подсилСна с Π±ΡƒΡ„Π΅Ρ€ Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° вмСсто 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 Π΅ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°, Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π² sysfile.c. ΠŸΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°ΠΌ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ цСлия ΠΌΡƒ ΠΊΠΎΠ΄. БлоТността Π΅ Π½Π° Π½ΠΈΠ²ΠΎ изходния ΠΊΠΎΠ΄ Π½Π° ΡˆΠ΅ΡΡ‚Π° рСдакция, Π½ΠΎ сС Ρ‡Π΅Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-лСсно ΠΈ приятно.

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 Π³. β€žThe Linux Kernel Implementation of Pipes and FIFOsβ€œ Π΅ ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° Π½Π°Ρ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ работят (всС ΠΎΡ‰Π΅) Ρ‚Ρ€ΡŠΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ Π² Linux. А Π½Π΅ΠΎΡ‚Π΄Π°Π²Π½Π°ΡˆΠ΅Π½ ΠΊΠΎΠΌΠΈΡ‚ Π² Linux ΠΈΠ»ΡŽΡΡ‚Ρ€ΠΈΡ€Π° ΠΌΠΎΠ΄Π΅Π»Π° Π½Π° взаимодСйствиС с Ρ‚Ρ€ΡŠΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈ, Ρ‡ΠΈΠΉΡ‚ΠΎ ΠΊΠ°ΠΏΠ°Ρ†ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄Ρ…Π²ΡŠΡ€Π»Ρ функционалността Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅; Π° ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠΎΠ»ΠΊΠΎ Π΄Π°Π»Π΅Ρ‡ са сС Ρ€Π°Π·Π²ΠΈΠ»ΠΈ Ρ‚Ρ€ΡŠΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΎΡ‚ β€žΠΌΠ½ΠΎΠ³ΠΎ консСрвативната Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°β€œ Π² ΡˆΠ΅ΡΡ‚ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° ядро Unix.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster