Operating Systems: Three Easy Pieces. Part 3: Process API (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄)

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€! Π₯ΠΎΡ‡Ρƒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π°ΡˆΠ΅ΠΌΡƒ вниманию ΡΠ΅Ρ€ΠΈΡŽ статСй-ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² ΠΎΠ΄Π½ΠΎΠΉ интСрСсной Π½Π° ΠΌΠΎΠΉ взгляд Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ β€” OSTEP. Π’ этом ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π΅ рассматриваСтся достаточно Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Ρ€Π°Π±ΠΎΡ‚Π° unix-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ β€” Ρ€Π°Π±ΠΎΡ‚Π° с процСссами, Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°ΠΌΠΈ, ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠΈΠΌΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ОБ. ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π» всСх ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚. ΠŸΡ€ΠΎΡˆΡƒ ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π½Π΅ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ (достаточно вольно), Π½ΠΎ надСюсь ΠΎΠ±Ρ‰ΠΈΠΉ смысл я сохранил.

Π›Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Ρƒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚:

Π”Ρ€ΡƒΠ³ΠΈΠ΅ части:

А Π΅Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π³Π»ΡΠ΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎ ΠΌΠ½Π΅ Π½Π° ΠΊΠ°Π½Π°Π» Π² Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ =)

Алярм! ΠΊ этой Π»Π΅ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ Π»Π°Π±Π°! смотри Π³ΠΈΡ‚Ρ…Π°Π±

Process API

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создания процСсса Π² UNIX систСмС. Он происходит Ρ‡Π΅Ρ€Π΅Π· Π΄Π²Π° систСмных Π²Ρ‹Π·ΠΎΠ²Π° fork() ΠΈ exec().

Π’Ρ‹Π·ΠΎΠ² fork()

Operating Systems: Three Easy Pieces. Part 3: Process API (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄)

Рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая выполняСт Π²Ρ‹Π·ΠΎΠ² fork(). Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π΅ выполнСния Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ.

Operating Systems: Three Easy Pieces. Part 3: Process API (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄)

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΡ‹ Π²Ρ…ΠΎΠ΄ΠΈΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main() ΠΈ выполняСм Π²Ρ‹Π²ΠΎΠ΄ строки Π½Π° экран. Π‘Ρ‚Ρ€ΠΎΠΊΠ° содСрТит ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅ называСтся PID ΠΈΠ»ΠΈ process identifier. Π­Ρ‚ΠΎΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ примСняСтся Π² UNIX для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ процСссу. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π²Ρ‹Π·ΠΎΠ² fork(). Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ создаСтся практичСски точная копия процСсса. Для ОБ это выглядит Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π² систСмС Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π±Ρ‹ 2 ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Ρ‹ΠΉΠ΄ΡƒΡ‚ ΠΈΠ· выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork(). Π’Π½ΠΎΠ²ΡŒ созданныС процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ (ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ ΡΠΎΠ·Π΄Π°Π²ΡˆΠ΅ΠΌΡƒ Π΅Π³ΠΎ процСссу-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ) ΡƒΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, начиная с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main(). Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π½Π΅ являСтся Ρ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠ΅ΠΉ процСсса-родитСля, Π² частности Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ собствСнноС адрСсноС пространство, собствСнныС рСгистры, свой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° исполняСмыС инструкции ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚Π΅Π»ΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork() Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π½Ρ‹ΠΌ. Π’ частности, процСсс-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π² качСствС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PID процСсса Ρ€Π΅Π±Π΅Π½ΠΊΠ°, Π° Ρ€Π΅Π±Π΅Π½ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎΠ΅ 0. По этим ΠΊΠΎΠ΄Π°ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² дальнСйшСм ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ процСссы ΠΈ Π·Π°ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠŸΡ€ΠΈ этом Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ строго. ПослС раздСлСния Π½Π° 2 процСсса ОБ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Π½ΠΈΠΌΠΈ, Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π’ случаС выполнСния Π½Π° одноядСрном процСссорС, Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· процСссов, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС β€” Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ. ΠŸΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ запускС ситуация ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒΡΡ ΠΈΠ½Π°Ρ‡Π΅.

Π’Ρ‹Π·ΠΎΠ² wait()

Operating Systems: Three Easy Pieces. Part 3: Process API (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄)

Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π’ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π·Π° счСт наличия Π²Ρ‹Π·ΠΎΠ²Π° wait() процСсс-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. Π’ этом случаС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ строго ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ тСкста Π½Π° экран

Operating Systems: Three Easy Pieces. Part 3: Process API (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄)

Π’Ρ‹Π·ΠΎΠ² exec()

Operating Systems: Three Easy Pieces. Part 3: Process API (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄)

Рассмотрим Π²Ρ‹Π·ΠΎΠ² exec(). Π­Ρ‚ΠΎΡ‚ систСмный Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ execvp() для запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ wc, которая являСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ подсчСта слов. Π§Ρ‚ΠΎ ΠΆΠ΅ происходит ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ exec()? Π­Ρ‚ΠΎΠΌΡƒ Π²Ρ‹Π·ΠΎΠ²Ρƒ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² имя исполняСмого Ρ„Π°ΠΉΠ»Π° ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹. ПослС Ρ‡Π΅Π³ΠΎ происходит Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΊΠΎΠ΄Π° ΠΈ статичСских Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· этого исполняСмого Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Ρ‚ΠΈΡ€Π°Π½ΠΈΠ΅ собствСнного сСгмСнта с ΠΊΠΎΠ΄ΠΎΠΌ. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ участки памяти, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ стСк ΠΈ ΠΊΡƒΡ‡Π° ΠΏΠ΅Ρ€Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. ПослС Ρ‡Π΅Π³ΠΎ ОБ просто исполняСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, пСрСдавая Π΅ΠΉ Π½Π°Π±ΠΎΡ€ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π½Π΅ создавали Π½ΠΎΠ²Ρ‹ΠΉ процСсс, ΠΌΡ‹ просто трансформировали Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ПослС выполнСния Π²Ρ‹Π·ΠΎΠ²Π° exec() Π² ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅ наступаСт Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ Π±Ρ‹ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°Π»Π°ΡΡŒ.

Π’Π°ΠΊΠΎΠ΅ услоТнСниС запуска Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ для shell ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Unix, ΠΈ позволяСт этой ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ послС Π²Ρ‹Π·ΠΎΠ²Π° fork(), Π½ΠΎ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° exec(). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ подстройка окруТСния ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΏΠΎΠ΄ Π½ΡƒΠΆΠ΄Ρ‹ запускаСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π΅ нСпосрСдствСнным запуском.

Shell β€” всСго лишь ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. Она ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π²Π°ΠΌ строку ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ ΠΈ ΠΆΠ΄Π΅Ρ‚, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π² Π½Π΅Π³ΠΎ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Ссли Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚ΡƒΠ΄Π° имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, shell Π½Π°ΠΉΠ΄Π΅Ρ‚ Π΅Π³ΠΎ мСсторасполоТСниС, Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ fork(), Π° Π·Π°Ρ‚Π΅ΠΌ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ процСсс Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ² exec() ΠΈ доТдСтся Π΅Π³ΠΎ выполнСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° wait(). Когда процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ shell вСрнСтся ΠΈΠ· Π²Ρ‹Π·ΠΎΠ²Π° wait() ΠΈ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ снова строку ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ Π²Π²ΠΎΠ΄Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ fork() & exec() позволяСт shell Π΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:
wc file > new_file.

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ wc ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ». Бпособ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ shell достигаСт этого достаточно прост β€” ΠΏΡ€ΠΈ создании процСсса-Ρ€Π΅Π±Π΅Π½ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ exec(), shell Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» new_file, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, вСсь Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ· Π΄Π°Π»Π΅Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ wc Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ Π² Ρ„Π°ΠΉΠ» вмСсто экрана.

Unix pipe Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, с Ρ€Π°Π·Π½ΠΈΡ†Π΅ΠΉ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π²Ρ‹Π·ΠΎΠ² pipe(). Π’ этом случаС ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° процСсса Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ pipe, располоТСнной Π² ядрС ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ присоСдинСн ΠΏΠΎΡ‚ΠΎΠΊ Π²Π²ΠΎΠ΄Π° Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса.

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