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

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

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

β€’ Если процСсс ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигналы Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, ядро пСрСзапускаСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ 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 процСссы Π±ΡƒΠ΄ΡƒΡ‚ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ, Ссли ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ усыновлСнных ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ², ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΡ… сущСствованиС.

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

#include β€Ήsignal.hβ€Ί