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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 152

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

$ <b>ch10-reap2</b> /* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ */

waiting for signals

Entered childhandler /* ΠžΠΏΡ€ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° */

Β  reaped process 2702

Β  pid 2703 not available yet

Β  pid 2704 not available yet

Β  pid 2705 not available yet

Β  pid 27 06 not available yet

Exited childhandler

waiting for signals

Entered childhandler /* И ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ */

Β  reaped process 2703

Β  pid 2704 not available yet

Β  pid 2705 not available yet

Β  pid 2706 not available yet

Exited childhandler

waiting for signals

Entered childhandler /* И Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ */

Β  reaped process 2704

Β  pid 2705 not available yet

Β  pid 2706 not available yet

Exited childhandler

waiting for signals

Entered childhandler

Β  reaped process 2705

Β  pid 2706 not available yet

Exited childhandler

waiting for signals

Entered childhandler

Β  reaped process 2706

Exited childhandler

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс поступаСт Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½

SIGCHLD
! Π₯отя это прСкрасно ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ воспроизводимо Π½Π° этой систСмС, это Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ. Как Π½Π° Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΌ, Ρ‚Π°ΠΊ ΠΈ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΌ ядрС ΠΈ Π½Π° Solaris ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ сигнал для Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°:

$ <b>uname -a</b> /* ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ систСмы */

Linux example2 2.4.22-1.2115.npt1 #1 Wed Oct 29 15:42:51 EST 2003 i686 i686 i386 GNU/Linux

$ <b>ch10-reap2</b> /* Запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

waiting for signals

Entered childhandler /* ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала Π²Ρ‹Π·Π²Π°Π½ лишь ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ */

Β  reaped process 9564

Β  reaped process 9565

Β  reaped process 9566

Β  reaped process 9567

Β  reaped process 9568

Exited childhandler

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•. Π’ ΠΊΠΎΠ΄Π΅ для

ch10-reap2.c
Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½Ρ‹ΠΉ Π΄Π΅Ρ„Π΅ΠΊΡ‚Β β€” состояниС Π³ΠΎΠ½ΠΊΠΈ. ВзглянитС Π΅Ρ‰Π΅ Ρ€Π°Π· Π½Π° строки 106–112 Π²
ch10-reap2.c
. Π§Ρ‚ΠΎ случится, Ссли
SIGCHLD
появится ΠΏΡ€ΠΈ исполнСнии этого ΠΊΠΎΠ΄Π°? Массив
kids
ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅
nkids
ΠΈ
kidsleft
ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½Π½Ρ‹ΠΌΠΈ: ΠΊΠΎΠ΄ Π²
main
добавляСт Π½ΠΎΠ²Ρ‹ΠΉ процСсс, Π½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½.

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° являСтся ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ критичСского Ρ€Π°Π·Π΄Π΅Π»Π°; ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ исполнСнии. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ способом Ρ€Π°Π±ΠΎΡ‚Ρ‹ с этим ΠΊΠΎΠ΄ΠΎΠΌ являСтся Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π΅Π³ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сначала Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚

SIGCHLD
.

10.8.3.3. Π‘Ρ‚Ρ€ΠΎΠ³ΠΈΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°

siginfo_t
ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊ сигнала с трСмя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ с ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ. Для SIGCHLD ΠΏΠΎΠ»Π΅
si_code
структуры
siginfo_t
ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ посылки сигнала (остановка, Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅, Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ процСсса ΠΈ Ρ‚.Π΄.). Π’ Ρ‚Π°Π±Π». 10.5 прСдставлСн ΠΏΠΎΠ»Π½Ρ‹ΠΉ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ВсС ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² качСствС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ XSI стандарта POSIX.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°,

ch10-status.c
, дСмонстрируСт использованиС структуры
siginfo_t
.

1Β  /* ch10-status.c --- дСмонстрируСт ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ SIGCHLD, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ с 3 Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ */

2

3Β  #include &lt;stdio.h&gt;

4Β  #include &lt;errno.h&gt;

5Β  #include &lt;signal.h&gt;

6Β  #include &lt;string.h&gt;

7Β  #include &lt;sys/types.h&gt;

8 Β #include &lt;sys/wait.h&gt;

9

10 void manage(siginfo_t *si);

11

/* ...Π½Π΅ измСнившийся для format_num() ΠΊΠΎΠ΄ ΠΎΠΏΡƒΡ‰Π΅Π½... */

Π’Π°Π±Π»ΠΈΡ†Π° 10.5. ЗначСния

si_code
XSI для
SIGCHLD

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Бмысл
CLD_CONTINUED
ΠžΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π±Ρ‹Π» Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½.
CLD_DUMPED
ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ с ошибкой, создан ΠΎΠ±Ρ€Π°Π· процСсса
CLD_EXITED
ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ.
CLD_KILLED
ΠŸΠΎΡ‚ΠΎΠΌΠΎΠΊ Π±Ρ‹Π» Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ сигналом
CLD_STOPPED
ΠŸΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ процСсс Π±Ρ‹Π» остановлСн.
CLD_TRAPPED
ВрассируСмый ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ остановлСн (Π­Ρ‚ΠΎ условиС Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° трассируСтся β€” Π»ΠΈΠ±ΠΎ ΠΈΠ· ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°, Π»ΠΈΠ±ΠΎ для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π’ любом случаС, Π²Ρ‹ вряд Π»ΠΈ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π΅Π³ΠΎ Π² ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ситуациях.)

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 3–8 Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ стандартныС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, строка 10 ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚

manage()
, которая ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с измСнСниями состояния ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Π° функция
format_num()
Π½Π΅ измСнилась ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ.