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

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

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

10.8.3. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π½Π°Π΄Π·ΠΎΡ€: Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ стратСгии

Как описано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 9.1.1 Β«Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ процСсса:

fork()
Β», ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктом Π²Ρ‹Π·ΠΎΠ²Π°
fork()
являСтся созданиС ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ· своих ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ статус Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ процСсса посрСдством ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· сСмСйства систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²
wait()
.

Π—Π°Π²Π΅Ρ€ΡˆΠΈΠ²ΡˆΠΈΠ΅ΡΡ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Π΅ процСссы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π», Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π·ΠΎΠΌΠ±ΠΈ (zombies). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ процСсса ядро посылаСт Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ процСссу сигнал

SIGCHLD
[112]. ДСйствиСм ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ этого сигнала. Π’ этом случаС процСссы Π·ΠΎΠΌΠ±ΠΈ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚
wait()
ΠΈΠ»ΠΈ Π½Π΅ закончится сам. Π’ послСднСм случаС процСссы Π·ΠΎΠΌΠ±ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π² качСствС Π½ΠΎΠ²ΠΎΠ³ΠΎ родитСля систСмный процСсс
init
(PID 1), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΎΡ‚ Π½ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ своСй ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π‘Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ
init
, ΠΈ ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ собраны ΠΏΡ€ΠΈ ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ.

SIGCHLD
ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для большСго, Ρ‡Π΅ΠΌ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ остановкС ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° (посрСдством ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· обсуТдСнных Ρ€Π°Π½Π΅Π΅ сигналов управлСния заданиями) Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ Ρ‚Π°ΠΊΠΆΠ΅ посылаСтся
SIGCHLD
. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ POSIX ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ
SIGCHLD
Β«ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ послан» Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠΌΠΎΠΊ вновь запускаСтся; ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, срСди ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Unix-систСм ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ различия.

Π‘ΠΎΡ‡Π΅Ρ‚Π°Π½ΠΈΠ΅ Ρ„Π»Π°Π³ΠΎΠ² для поля

sa_flags
Β  Π²
struct sigation
и использованиС
SIG_IGN
Π² качСствС дСйствия для
SIGCHLD
позволяСт ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ способ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ядром остановок, возобновлСния ΠΈΠ»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ².

Как ΠΈ с сигналами Π² ΠΎΠ±Ρ‰Π΅ΠΌ, описанныС здСсь интСрфСйсы ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ слоТны, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Ρ€Π°Π·Π²ΠΈΠ²Π°Π»ΠΈΡΡŒ с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

10.8.3.1. ΠŸΠ»ΠΎΡ…ΠΈΠ΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ: ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΌ дСйствиСм, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, являСтся ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ дСйствия для

SIGCHLD
Π½Π°
SIG_IGN
. Π’ этом случаС Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ²ΡˆΠΈΠ΅ΡΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ Π½Π΅ становятся Π·ΠΎΠΌΠ±ΠΈ. ВмСсто этого статус ΠΈΡ… Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ отбрасываСтся, ΠΈ ΠΎΠ½ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· систСмы.

Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ, Π΄Π°ΡŽΡ‰Π΅ΠΉ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, являСтся использованиС Ρ„Π»Π°Π³Π°

SA_NOCLDWAIΠ’
. Π’ ΠΊΠΎΠ΄Π΅:

/* Π‘Ρ‚Π°Ρ€Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ: */Β Β Β Β Β Β Β  /* Новый ΡΡ‚ΠΈΠ»ΡŒ: */

signal(SIGCHLD, SIG_IGN);Β  struct sigaction sa;

Β Β Β Β Β  Β Β Β Β  Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  sa.sa_handler = SIG_IGN;

Β Β Β Β  Β Β Β Β Β Β Β Β  Β Β Β Β Β Β Β Β Β Β Β  Β sa.sa_flags = SA_NOCLDWAIT;

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  Β sigemptyset(&sa.sa_mask);

Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β  Β sigaction(SIGCHLD, &sa, NULL);

10.8.3.2. Π‘Π½ΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΠΈ: ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°Π΄Π·ΠΎΡ€

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ лишь ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ° ΠΈ Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒΡΡ простыми измСнСниями состояния (остановкС ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ). Π’ этом случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„Π»Π°Π³

SA_NOCLDSTOP
ΠΈ установитС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ
wait()
(ΠΈΠ»ΠΈ Ρ€ΠΎΠ΄ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ) для получСния Π΄Π°Π½Π½Ρ‹Ρ… процСсса.

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ сигналу

SIGCHLD
Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ
SIGCHLD
ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊΒ» ΠΈ Π±Ρ‹Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅
SIGCHLD
свСдСния ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большСм числС ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ².

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

ch10-reap1.с
, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚
SIGCHLD
Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²Π° Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ².

1 Β /* ch10-reap1.с --- дСмонстрируСт ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ SIGCHLD с использованиСм Ρ†ΠΈΠΊΠ»Π° */

2

3 Β #include <stdio.h>

4 Β #include <errno.h>

5 Β #include <signal.h>

6 Β #include <string.h>

7 Β #include <sys/types.h>

8 Β #include <sys/wait.h>

9

10 #define MAX_KIDS 42

11 #define NOT_USED -1

12

13 pid_t kids[MAX_KIDS];

14 size_t nkids = 0;

Массив ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² отслСТиваСт ID ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹Ρ… процСссов. Если элСмСнт содСрТит

NOT_USED
, ΠΎΠ½ Π½Π΅ прСдставляСт Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. (Π•Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ строки 89–90 Π²Π½ΠΈΠ·Ρƒ)
nkids
ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, сколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²
kids
слСдуСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ.

16 /* format_num --- Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [sf]printf() */

17

18 const char *format_num(int num)

19 {

20 #define NUMSIZ 30

21 Β static char buf[NUMSIZ];

22 Β int i;

23

24Β  if (num <= 0) {

25Β Β  strcpy(buf, "0");

26Β Β  return buf;

27Β  }

28

29Β  i = NUMSIZ - 1;

30Β  buf[i--] = '\0';

31

32Β  /* ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² строку. */

33Β  do {

34Β Β  buf[i--] = (num % 10) + '0';

35Β Β  num /= 10;

36Β  } while (num > 0);

37

38 Β return &buf[i+1];

39 }

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сСмСйства

printf()
, ΠΌΡ‹ прСдусмотрСли для прСобразования дСсятичного сигнала ΠΈΠ»ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° PID Π² строку ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Β«Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽΒ» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
format_num()
. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎ, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.