Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «АрхитСктура ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 61

Автор ΠœΠΎΡ€ΠΈΡ Π‘Π°Ρ…

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½Π° РисункС 7.15, процСсс создаСт Π½ΠΎΠ²Ρ‹ΠΉ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ свой ΠΊΠΎΠ΄ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pause, ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡŒ Π΄ΠΎ получСния сигнала. ΠŸΡ€ΠΎΡ†Π΅ΡΡ-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ PID своСго ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, возвращая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ status. Если Π±Ρ‹ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit отсутствовал, Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° сдСлала Π±Ρ‹ Π΅Π³ΠΎ ΠΏΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ процСсса ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main. ΠŸΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ процСсс ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ получСния сигнала, Π΄Π°ΠΆΠ΅ Ссли Π΅Π³ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΡƒΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ.

7.4 ΠžΠ–Π˜Π”ΠΠΠ˜Π• Π—ΠΠ’Π•Π Π¨Π•ΠΠ˜Π― Π’Π«ΠŸΠžΠ›ΠΠ•ΠΠ˜Π― ΠŸΠ ΠžΠ¦Π•Π‘Π‘Π

ΠŸΡ€ΠΎΡ†Π΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ своСго выполнСния с ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ссли Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ систСмной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ wait. Бинтаксис Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:


pid = wait(stat_addr);


Π³Π΄Π΅ pid β€” Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ (PID) ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎ своС сущСствованиС ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, stat_addr β€” адрСс ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ†Π΅Π»ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ exit Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π² пространствС Π·Π°Π΄Π°Ρ‡ΠΈ.


main() {

 int child;

 if ((child = fork()) == 0)  {

  printf("PID ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° %d\n", getpid());

  pause(); /* приостанов выполнСния Π΄ΠΎ получСния сигнала */

 }

 /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ */

 printf("PID ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° %d\n", child);

 exit(child);

}

Рисунок 7.15. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit


Алгоритм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½Π° РисункС 7.16. Π―Π΄Ρ€ΠΎ Π²Π΅Π΄Π΅Ρ‚ поиск ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² процСсса, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡ… сущСствованиС, ΠΈ Π² случаС ΠΈΡ… отсутствия Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Если ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΉ сущСствованиС, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½, ядро ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΊΠΎΠ΄ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit, процСссу, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit (status) Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉΡΡ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ значСния, Π² Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ содСрТащиС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ процСсса, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ довольно Ρ€Π΅Π΄ΠΊΠΎ. Π―Π΄Ρ€ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ поля, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ пространству Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса, Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½Ρ‹Π΅ значСния ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ исполнСния процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ядра ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, освобоТдаСт Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ процСссов мСсто, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π² Π½Π΅ΠΉ Π·Π°Π½ΠΈΠΌΠ°Π» ΠΏΡ€Π΅ΠΆΠ΄Π΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΉ сущСствованиС процСсс. Π­Ρ‚ΠΎ мСсто Π±ΡƒΠ΄Π΅Ρ‚ прСдоставлСно Π½ΠΎΠ²ΠΎΠΌΡƒ процСссу.

Если процСсс, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait, ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‰ΠΈΡ… сущСствованиС, ΠΎΠ½ приостанавливаСтся Π΄ΠΎ получСния ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ сигнала. Π―Π΄Ρ€ΠΎ Π½Π΅ возобновляСт ΠΏΠΎ своСй ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π΅ процСсс, ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠΈΠΉΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait: Ρ‚Π°ΠΊΠΎΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС получСния сигнала. На всС сигналы, ΠΊΡ€ΠΎΠΌΠ΅ сигнала «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β», процСсс Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π°Π½Π΅Π΅ рассмотрСнным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. РСакция процСсса Π½Π° сигнал «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β» проявляСтся ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π² зависимости ΠΎΡ‚ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²:

β€’ По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ссли ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ Π½Π΅ ΠΎΠ³ΠΎΠ²ΠΎΡ€Π΅Π½Ρ‹ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ дСйствия) процСсс Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· состояния останова, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ вошСл с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait, ΠΈ запускаСт Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ issig для опознания Ρ‚ΠΈΠΏΠ° ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠ΅Π³ΠΎ сигнала. Алгоритм issig (Рисунок 7.7) рассматриваСт особый случай поступлСния сигнала Ρ‚ΠΈΠΏΠ° «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β» ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ «лоТь». ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ядро Π½Π΅ выполняСт longjump ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sleep, Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait. Оно пСрСзапускаСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡ… сущСствованиС (ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΎΠ΄Π½ΠΎΠ³ΠΎ), освобоТдаСт мСсто Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ процСссов, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ этими ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ, ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait, возвращая ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ процСссу, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ Π΅Π΅.

β€’ Если процСссы ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ сигналы Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ядро Π΄Π΅Π»Π°Π΅Ρ‚ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ установки для запуска ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигнала, ΠΊΠ°ΠΊ ΠΈ Π² случаС поступлСния сигнала любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

β€’ Если процСсс ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигналы Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ядро пСрСзапускаСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait, освобоТдаСт Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ процСссов мСсто, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΠΌΠΈ сущСствованиС, ΠΈ исслСдуСт ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ².


Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ wait

входная информация: Π°Π΄Ρ€Π΅Ρ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ для хранСния значСния status, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΌΡΡ процСссом

выходная информация: ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΠΈ ΠΊΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit

{

 if (процСсс, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²) return (ΠΎΡˆΠΈΠ±ΠΊΡƒ);

 for (;;) {  /* Ρ†ΠΈΠΊΠ» с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ */

  if (процСсс, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait, ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠΈΡ… сущСствованиС) {

   Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°;

   ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± использовании ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ рСсурсов Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ процСссора;

   ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ процСссов мСсто, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ;

   return (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, ΠΊΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ);

  }

  if (Ρƒ процСсса Π½Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²) return ΠΎΡˆΠΈΠ±ΠΊΡƒ;

  ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΌ прСрывания (Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°);

 }

}

Рисунок 7.16. Алгоритм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait

НапримСр, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ запускаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ Π½Π° РисункС 7.17, с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΈ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим случай, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ запускаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (СдинствСнный ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ argc Ρ€Π°Π²Π½ΠΎ 1). Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ 15 ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ с ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° i, Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ процСсса Π² порядкС очСрСдности создания. Π―Π΄Ρ€ΠΎ, исполняя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait для родитСля, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎ сущСствованиС, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ ΠΊΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit. ΠŸΡ€ΠΈ этом Π·Π°Ρ€Π°Π½Π΅Π΅ Π½Π΅ извСстно, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½. Из тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅ΠΉ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ exit, написанной Π½Π° языкС Π‘ΠΈ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ стандартных ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit Π² Π±ΠΈΡ‚Π°Ρ… 8-15 поля ret_code ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² ret_code хранится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ 256*i, Π³Π΄Π΅ i β€” Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Π° Π² ret_val заносится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°.

Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ запускаСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ argc β€Ί 1), Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ signal Π΄Π΅Π»Π°Π΅Ρ‚ распоряТСниС ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигналы Ρ‚ΠΈΠΏΠ° «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β». ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс, выполняя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait, приостановился Π΅Ρ‰Π΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π» ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit: ΠΊΠΎΠ³Π΄Π° процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit, ΠΎΠ½ посылаСт своСму Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ сигнал «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β»; Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс возобновляСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π±Ρ‹Π» приостановлСн с ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΌ прСрывания. Когда Ρ‚Π°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΎΠ½ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚, Ρ‡Ρ‚ΠΎ сигнал сообщал ΠΎ Β«Π³ΠΈΠ±Π΅Π»ΠΈΒ» ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°; ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигналы этого Ρ‚ΠΈΠΏΠ° ΠΈ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ…, ядро удаляСт ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ процСссов запись, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠ΅ΠΌΡƒ сущСствованиС ΠΏΠΎΡ‚ΠΎΠΌΠΊΡƒ, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait Ρ‚Π°ΠΊ, словно сигнала ΠΈ Π½Π΅ Π±Ρ‹Π»ΠΎ. Π―Π΄Ρ€ΠΎ выполняСт эти дСйствия всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сигнал Ρ‚ΠΈΠΏΠ° «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β», Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Ρ†ΠΈΠΊΠ» выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ установлСно, Ρ‡Ρ‚ΠΎ Ρƒ процСсса большС ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² Π½Π΅Ρ‚. Π’ΠΎΠ³Π΄Π° функция wait Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ -1. Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ двумя способами запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС процСсс-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΆΠ΄Π΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ любого ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΎΠ½ ΠΆΠ΄Π΅Ρ‚, ΠΏΠΎΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ всС Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ.


#include β€Ήsignal.hβ€Ί

main(argc, argv)

int argc;

char *argv[];

{

 int i, ret_val, ret_code;

 if (argc β€Ί= 1) signal(SIGCLD, SIG_IGN); /* ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² */

 for (i = 0; i β€Ή 15; i++) if (fork() == 0) {

   /* процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ */

   printf("процСсс-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ %x\n", getpid());

   exit(i);

  }

  ret_val = wait(&ret_code);

  printf("wait ret_val %x ret_code %x\n", ret_val, ret_code);

}

Рисунок 7.17. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait ΠΈ игнорирования сигнала «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β»


Π’ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях систСмы UNIX Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ exit ΠΈ wait Π½Π΅ использовали ΠΈ Π½Π΅ рассматривали сигнал Ρ‚ΠΈΠΏΠ° «гибСль ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Β». ВмСсто посылки сигнала функция exit возобновляла Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса. Если Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait приостановился, ΠΎΠ½ возобновляСтся, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎ сущСствованиС, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС возобновлСния Π½Π΅ происходит; процСсс-Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ «погибшСго» ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ wait. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈ процСсс Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (init) ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wait, ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠΎ exit процСссы Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ, Ссли ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ усыновлСнных ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΡ… сущСствованиС.