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

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

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

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 99–100 ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½Π°Π±ΠΎΡ€ сигналов, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ…

SIGCHLD
, Π° строка 102 устанавливаСт ΠΈΡ… Π² качСствС маски сигналов процСсса для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 104–109 ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΏΡΡ‚ΡŒ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… процСссов, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… засыпаСт Π½Π° Ρ‚Ρ€ΠΈ сСкунды. По Ρ…ΠΎΠ΄Ρƒ Π΄Π΅Π»Π° ΠΎΠ½ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ массив

kids
ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
nkids
.

Π‘Ρ‚Ρ€ΠΎΠΊΠ° 111 Π΄Π°Π΅Ρ‚ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌ шанс Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ, заснув Π½Π° Π΅Ρ‰Π΅ больший ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. (Π­Ρ‚ΠΎ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Π΅ процСссы Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ, Π½ΠΎ ΡˆΠ°Π½ΡΡ‹ довольно Π²Π΅Π»ΠΈΠΊΠΈ.)

НаконСц, строки 113–114 выводят сообщСниС ΠΈ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ, Π·Π°ΠΌΠ΅Π½ΠΈΠ² маску сигналов процСсса, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ

SIGCHLD
, пустой маской. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ сигналу
SIGCHLD
, Ρ‡Ρ‚ΠΎ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ запуск ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала. Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ происходит:

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

waiting for signal

Entered childhandler

Β  reaped process 23937

Β  reaped process 23938

Β  reaped process 23939

Β  reaped process 23940

Β  reaped process 23941

Exited childhandler

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала собираСт свСдСния ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°Ρ… Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄.

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

ch10-reap2.c
, сходна с
ch10-reap1.c
. Π Π°Π·Π½ΠΈΡ†Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° допускаСт появлСниС сигнала
SIGCHLD
Π² любоС врСмя. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ шанс получСния Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ
SIGCHLD
, Π½ΠΎ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ это. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала всС Ρ€Π°Π²Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ†ΠΈΠΊΠ»Π΅ нСсколько ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ².

1Β  /* ch10-reap2.c β€” дСмонстрируСт ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ SIGCHLD, ΠΎΠ΄ΠΈΠ½ сигнал Π½Π° ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° */

2

Β Β  /* ...Π½Π΅ измСнившийся ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½... */

12

13 pid_t kids[MAX_KIDS];

14 size_t nkids = 0;

15 size_t kidsleft = 0; /* &lt;&lt;&lt; Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ */

16

Β /* ...Π½Π΅ измСнившийся ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½... */

41

42 /* childhandler --- ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ SIGCHLD, опрос всСх доступных ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² */

43

44 void childhandler(int sig)

45 {

46Β  int status, ret;

47Β  int i;

48Β  char buf[100];

49Β  static const char entered[] = &quot;Entered childhandler\n&quot;;

50Β  static const char exited[] = &quot;Exited childhandler\n&quot;;

51

52Β  write(1, entered, strlen(entered));

53Β  for (i = 0; i &lt; nkids; i++) {

54Β Β  if (kids[i] == NOT_USED)

55Β Β Β  continue;

56

57Β retry:

58Β  if ((ret = waitpid(kids[i], &amp;status, WNOHANG)) == kids[i]) {

59Β Β  strcpy(buf, &quot;\treaped process &quot;);

60 Β Β strcat(buf, format_num(ret));

61Β Β  strcat(buf, &quot;\n&quot;);

62Β  Β write(1, buf, strlen(buf));

63 Β  kids[i] = NOT_USED;

64Β  Β kidsleft--; /* &lt;&lt;&lt; Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ */

65Β  } else if (ret == 0) {

Β Β Β  /* ...Π½Π΅ измСнившийся ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½... */

80Β  write(1, exited, strlen(exited));

81Β }

Π­Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсии Π·Π° Ρ‚Π΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ новая пСрСмСнная,

kidsleft
, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ, сколько имССтся Π½Π΅ ΠΎΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 15 ΠΈ 64 ΠΏΠΎΠΌΠ΅Ρ‡Π°ΡŽΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄.

83Β  /* main --- установка относящСйся ΠΊ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΌ процСссам свСдСний

Β Β Β Β Β Β  ΠΈ сигналов, созданиС ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… процСссов */

84

85 Β int main(int argc, char **argv)

86Β  {

Β Β Β Β  /* ...Π½Π΅ измСнившийся ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½... */

100

101Β  sigemptyset(&amp;childset);

102Β  sigaddset(&amp;childset, SIGCHLD);

103

104Β  /* sigprocmask(SIG_SETMASK, &amp;childset, NULL); /* Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠ΄Π΅ main */

105

106Β  for (nkids = 0; nkids &lt; 5; nkids++) {

107Β Β  if ((kids[nkids] = fork()) == 0) {

108Β Β Β  sleep(3);

109Β Β Β  _exit(0);

110Β Β  }

111Β Β  kidsleft++; /* &lt;&lt;&lt; Added */

112Β  }

113

114Β  /* sleep(5); /* Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌ шанс Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ */

115

116Β  while (kidsleft &gt; 0) { /* &lt;&lt;&lt; Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ */

117Β Β  printf(&quot;waiting for signals\n&quot;);

118Β Β Β sigsuspend(&amp;emptyset);

119Β  } /* &lt;&lt;&lt; Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ */

120

121Β  return 0;

122 }

Π—Π΄Π΅ΡΡŒ ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 104 ΠΈ 114 Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсии, Π° строки 111, 116 ΠΈ 119 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹. Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈ запускС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ мСняСтся Π² зависимости ΠΎΡ‚ вСрсии ядра!

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

Linux example1 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux