ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ систСми: Π’Ρ€ΠΈ лСсни части. Част 3: ΠŸΡ€ΠΎΡ†Π΅Ρ API (ΠΏΡ€Π΅Π²ΠΎΠ΄)

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

Π₯Π΅ΠΉ Π₯Π°Π±Ρ€! Π‘ΠΈΡ… искал Π΄Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ° Π½Π° Π²Π°ΡˆΠ΅Ρ‚ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΠΎΡ€Π΅Π΄ΠΈΡ†Π° ΠΎΡ‚ статии-ΠΏΡ€Π΅Π²ΠΎΠ΄ΠΈ Π½Π° Π΅Π΄Π½Π° интСрСсна спорСд ΠΌΠ΅Π½ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π° - OSTEP. Π’ΠΎΠ·ΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» обсъТда доста дълбоко Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° unix-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ систСми, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с процСси, Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‡ΠΈΡ†ΠΈ, ΠΏΠ°ΠΌΠ΅Ρ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΡΡ‚Π°Π²Π»ΡΠ²Π°Ρ‚ ΡΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π° систСма. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π° Π½Π° всички ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΈ Ρ‚ΡƒΠΊ Ρ‚ΡƒΠΊ. Моля, ΠΈΠΌΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ ΠΏΡ€Π΅Π²ΠΎΠ΄ΡŠΡ‚ Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½ нСпрофСсионално (съвсСм свободно), Π½ΠΎ сС надявам Π΄Π° съм Π·Π°ΠΏΠ°Π·ΠΈΠ» общия смисъл.

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

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

ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°Ρ‚Π΅ ΠΊΠ°Π½Π°Π»Π° ΠΌΠΈ Π½Π° Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌΠ° =)

Аларма! Π—Π° Ρ‚Π°Π·ΠΈ лСкция ΠΈΠΌΠ° лаборатория! Π’ΠΈΠΆ github

API Π·Π° процСси

НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° създаванС Π½Π° процСс Π² UNIX систСма. Π’ΠΎΠ²Π° сС случва Ρ‡Ρ€Π΅Π· Π΄Π²Π΅ систСмни повиквания Π²ΠΈΠ»ΠΈΡ†Π° () ΠΈ exec().

Call fork()

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ систСми: Π’Ρ€ΠΈ лСсни части. Част 3: ΠŸΡ€ΠΎΡ†Π΅Ρ API (ΠΏΡ€Π΅Π²ΠΎΠ΄)

ΠŸΠΎΠΌΠΈΡΠ»Π΅Ρ‚Π΅ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, която ΠΏΡ€Π°Π²ΠΈ fork() ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ изпълнСниС Ρ‰Π΅ бъдС слСдният.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ систСми: Π’Ρ€ΠΈ лСсни части. Част 3: ΠŸΡ€ΠΎΡ†Π΅Ρ API (ΠΏΡ€Π΅Π²ΠΎΠ΄)

ΠŸΡŠΡ€Π²ΠΎ, Π²Π»ΠΈΠ·Π°ΠΌΠ΅ във функцията main() ΠΈ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚Π²Π°ΠΌΠ΅ Π½ΠΈΠ·Π° Π½Π° Π΅ΠΊΡ€Π°Π½Π°. Π Π΅Π΄ΡŠΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° Π½Π° процСса, ΠΊΠΎΠΉΡ‚ΠΎ Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π° сС ΠΈΠ·Π²ΠΈΠΊΠ²Π° PID ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° процСса. Π’ΠΎΠ·ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² UNIX Π·Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°Π½Π΅ Π½Π° процСс. Π‘Π»Π΅Π΄Π²Π°Ρ‰Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ‰Π΅ ΠΈΠ·Π²ΠΈΠΊΠ° fork(). Π’ Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сС създава ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° процСса. Π—Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ‚Π° систСма ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Ρ‡Π΅ ΠΈΠΌΠ° 2 копия Π½Π° Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ Π² систСмата, която ΠΎΡ‚ своя страна Ρ‰Π΅ ΠΈΠ·Π»Π΅Π·Π΅ ΠΎΡ‚ функцията fork(). ΠΠΎΠ²ΠΎΡΡŠΠ·Π΄Π°Π΄Π΅Π½ΠΈΡΡ‚ Π΄ΡŠΡ‰Π΅Ρ€Π΅Π½ процСс (ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ Π½Π° родитСлския процСс, ΠΊΠΎΠΉΡ‚ΠΎ Π³ΠΎ Π΅ създал) Π²Π΅Ρ‡Π΅ няма Π΄Π° сС изпълнява, ΠΊΠ°Ρ‚ΠΎ сС Π·Π°ΠΏΠΎΡ‡Π½Π΅ ΠΎΡ‚ функцията main(). Врябва Π΄Π° сС ΠΏΠΎΠΌΠ½ΠΈ, Ρ‡Π΅ Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈΡΡ‚ процСс Π½Π΅ Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΠΎΠΏΠΈΠ΅ Π½Π° родитСлския процСс; ΠΏΠΎ-спСциално Ρ‚ΠΎΠΉ ΠΈΠΌΠ° своС собствСно адрСсно пространство, свои собствСни рСгистри, свой собствСн ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към изпълними инструкции ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ. По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ стойността, Π²ΡŠΡ€Π½Π°Ρ‚Π° Π½Π° извикващия функцията fork(), Ρ‰Π΅ бъдС Ρ€Π°Π·Π»ΠΈΡ‡Π½Π°. По-спСциално, родитСлският процСс Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ PID стойността Π½Π° Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈΡ процСс ΠΊΠ°Ρ‚ΠΎ Π²Ρ€ΡŠΡ‰Π°Π½Π΅, Π° Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈΡΡ‚ процСс Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ стойност, Ρ€Π°Π²Π½Π° Π½Π° 0. Използвайки Ρ‚Π΅Π·ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ слСд Ρ‚ΠΎΠ²Π° Π΄Π° Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ процСситС ΠΈ Π΄Π° ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅ всСки ΠΎΡ‚ тях Π΄Π° Π²ΡŠΡ€ΡˆΠΈ собствСната си Ρ€Π°Π±ΠΎΡ‚Π° . Π˜Π·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΎΠ±Π°Ρ‡Π΅ Π½Π΅ Π΅ строго Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΎ. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ сС Ρ€Π°Π·Π΄Π΅Π»ΠΈ Π½Π° 2 процСса, ОБ Π·Π°ΠΏΠΎΡ‡Π²Π° Π΄Π° Π³ΠΈ наблюдава, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΄Π° ΠΏΠ»Π°Π½ΠΈΡ€Π° тяхната Ρ€Π°Π±ΠΎΡ‚Π°. Ако сС изпълни Π½Π° СдноядрСн процСсор, Π΅Π΄ΠΈΠ½ ΠΎΡ‚ процСситС, Π² Ρ‚ΠΎΠ·ΠΈ случай родитСлят, Ρ‰Π΅ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ слСд Ρ‚ΠΎΠ²Π° Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈΡΡ‚ процСс Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ». ΠŸΡ€ΠΈ рСстартиранС ситуацията ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Π°.

Π˜Π·Ρ‡Π°ΠΊΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅()

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ систСми: Π’Ρ€ΠΈ лСсни части. Част 3: ΠŸΡ€ΠΎΡ†Π΅Ρ API (ΠΏΡ€Π΅Π²ΠΎΠ΄)

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

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ систСми: Π’Ρ€ΠΈ лСсни части. Част 3: ΠŸΡ€ΠΎΡ†Π΅Ρ API (ΠΏΡ€Π΅Π²ΠΎΠ΄)

ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ exec().

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ систСми: Π’Ρ€ΠΈ лСсни части. Част 3: ΠŸΡ€ΠΎΡ†Π΅Ρ API (ΠΏΡ€Π΅Π²ΠΎΠ΄)

ΠŸΠΎΠΌΠΈΡΠ»Π΅Ρ‚Π΅ Π·Π° прСдизвикатСлството exec(). Π’ΠΎΠ²Π° систСмно ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ искамС Π΄Π° стартирамС напълно Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°. Π’ΡƒΠΊ Ρ‰Π΅ сС ΠΎΠ±Π°Π΄ΠΈΠΌ execvp() Π·Π° Π΄Π° стартиратС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° wc, която Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π·Π° Π±Ρ€ΠΎΠ΅Π½Π΅ Π½Π° Π΄ΡƒΠΌΠΈ. Какво сС случва, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΈΠ·Π²ΠΈΠΊΠ° exec()? На Ρ‚ΠΎΠ²Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ сС ΠΏΡ€Π΅Π΄Π°Π²Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° изпълнимия Ρ„Π°ΠΉΠ» ΠΈ някои ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΊΠ°Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ. Π‘Π»Π΅Π΄ ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΊΠΎΠ΄ΡŠΡ‚ ΠΈ статичнитС Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ изпълним Ρ„Π°ΠΉΠ» сС Π·Π°Ρ€Π΅ΠΆΠ΄Π°Ρ‚ ΠΈ нСговият собствСн сСгмСнт с ΠΊΠΎΠ΄Π° сС прСзаписва. ΠžΡΡ‚Π°Π½Π°Π»ΠΈΡ‚Π΅ области Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, ΠΊΠ°Ρ‚ΠΎ стСка ΠΈ ΠΊΡƒΠΏΡ‡ΠΈΠ½Π°Ρ‚Π°, сС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ ΠΎΡ‚Π½ΠΎΠ²ΠΎ. Π‘Π»Π΅Π΄ ΠΊΠΎΠ΅Ρ‚ΠΎ ОБ просто изпълнява ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, ΠΊΠ°Ρ‚ΠΎ ΠΉ ΠΏΡ€Π΅Π΄Π°Π²Π° Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈ. Π’Π°ΠΊΠ° Ρ‡Π΅ Π½ΠΈΠ΅ Π½Π΅ ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ Π½ΠΎΠ² процСс, Π½ΠΈΠ΅ просто трансформирахмС Ρ‚Π΅ΠΊΡƒΡ‰ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Π² Π΄Ρ€ΡƒΠ³Π° Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°. Π‘Π»Π΅Π΄ изпълнСниС Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ exec() Π² наслСдника, ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Ρ‡Π΅ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π½Π΅ Π΅ стартирана.

Π’ΠΎΠ²Π° услоТнСниС ΠΏΡ€ΠΈ стартиранС Π΅ напълно Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ Π·Π° Unix shell ΠΈ позволява Π½Π° Ρ‚ΠΎΠ·ΠΈ shell Π΄Π° изпълни ΠΊΠΎΠ΄ слСд ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π²ΠΈΠ»ΠΈΡ†Π° (), Π½ΠΎ ΠΏΡ€Π΅Π΄ΠΈ ΠΎΠ±Π°ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ exec(). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ‚Π°ΠΊΡŠΠ² ΠΊΠΎΠ΄ Π±ΠΈ Π±ΠΈΠ» ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° срСдата Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π° към Π½ΡƒΠΆΠ΄ΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°, която сС стартира, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° я стартиратС.

Π§Π΅Ρ€ΡƒΠΏΠΊΠ° - просто потрСбитСлска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°. Вя Π²ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° Ρ€Π΅Π΄Π° с ΠΏΠΎΠΊΠ°Π½ΠΈΡ‚Π΅ ΠΈ Π²ΠΈ Ρ‡Π°ΠΊΠ° Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½Π΅Ρ‰ΠΎ Π² Π½Π΅Π³ΠΎ. Π’ ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ случаи, Π°ΠΊΠΎ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° Ρ‚Π°ΠΌ, ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π° Ρ‰Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈ Π½Π΅ΠΉΠ½ΠΎΡ‚ΠΎ мСстополоТСниС, Ρ‰Π΅ ΠΈΠ·Π²ΠΈΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° fork() ΠΈ слСд Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΠΈΠ·Π²ΠΈΠΊΠ° някакъв Ρ‚ΠΈΠΏ exec(), Π·Π° Π΄Π° създадС Π½ΠΎΠ² процСс ΠΈ Π΄Π° ΠΈΠ·Ρ‡Π°ΠΊΠ° Π΄Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΈΠ·Ρ‡Π°ΠΊΠ²Π°Π½Π΅() ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅. ΠšΠΎΠ³Π°Ρ‚ΠΎ Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈΡΡ‚ процСс ΠΈΠ·Π»Π΅Π·Π΅, ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π° Ρ‰Π΅ сС Π²ΡŠΡ€Π½Π΅ ΠΎΡ‚ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° wait() ΠΈ Ρ‰Π΅ ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚Π° ΠΎΡ‚Π½ΠΎΠ²ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Π½Π°Ρ‚Π° ΠΈ Ρ‰Π΅ ΠΈΠ·Ρ‡Π°ΠΊΠ° Π²ΡŠΠ²Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° слСдващата ΠΊΠΎΠΌΠ°Π½Π΄Π°.

РаздСлянСто Π½Π° fork() & exec() позволява Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π° Π΄Π° ΠΏΡ€Π°Π²ΠΈ слСднитС Π½Π΅Ρ‰Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:
wc Ρ„Π°ΠΉΠ» > Π½ΠΎΠ²_Ρ„Π°ΠΉΠ».

Π’ Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·Ρ…ΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° wc Π΅ прСнасочСн към Ρ„Π°ΠΉΠ». ΠΠ°Ρ‡ΠΈΠ½ΡŠΡ‚, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ ΡˆΠ΅Π»ΡŠΡ‚ постига Ρ‚ΠΎΠ²Π° Π΅ доста прост - Ρ‡Ρ€Π΅Π· създаванС Π½Π° Π΄ΡŠΡ‰Π΅Ρ€Π΅Π½ процСс ΠΏΡ€Π΅Π΄ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ exec(), ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°Ρ‚Π° затваря стандартния ΠΈΠ·Ρ…ΠΎΠ΄ ΠΈ отваря Ρ„Π°ΠΉΠ»Π° Π½ΠΎΠ²_Ρ„Π°ΠΉΠ», ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½, цСлият ΠΈΠ·Ρ…ΠΎΠ΄ ΠΎΡ‚ ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½Π°Ρ‚Π° изпълнявана ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° wc Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ прСнасочСни към Ρ„Π°ΠΉΠ» вмСсто към Π΅ΠΊΡ€Π°Π½.

Unix Ρ‚Ρ€ΡŠΠ±Π° сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ ΠΏΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π°Ρ‡ΠΈΠ½, с Ρ‚Π°Π·ΠΈ Ρ€Π°Π·Π»ΠΈΠΊΠ°, Ρ‡Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ pipe(). Π’ Ρ‚ΠΎΠ·ΠΈ случай изходният ΠΏΠΎΡ‚ΠΎΠΊ Π½Π° процСса Ρ‰Π΅ бъдС ΡΠ²ΡŠΡ€Π·Π°Π½ към опашка ΠΎΡ‚ ΠΊΠ°Π½Π°Π»ΠΈ, Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π° Π² ядрото, към която Ρ‰Π΅ бъдС ΡΠ²ΡŠΡ€Π·Π°Π½ входният ΠΏΠΎΡ‚ΠΎΠΊ Π½Π° Π΄Ρ€ΡƒΠ³ процСс.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€