10.8.3. Π ΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π½Π°Π΄Π·ΠΎΡ: ΡΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΈ
ΠΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 9.1.1 Β«Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ°:
fork()fork()wait()ΠΠ°Π²Π΅ΡΡΠΈΠ²ΡΠΈΠ΅ΡΡ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΡΡ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΎΠΆΠΈΠ΄Π°Π», Π½Π°Π·ΡΠ²Π°ΡΡΡΡ Π·ΠΎΠΌΠ±ΠΈ (zombies). ΠΠ±ΡΡΠ½ΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΠ΄ΡΠΎ ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠΈΠ³Π½Π°Π»
SIGCHLDwait()initinitSIGCHLDSIGCHLDSIGCHLDΠ‘ΠΎΡΠ΅ΡΠ°Π½ΠΈΠ΅ ΡΠ»Π°Π³ΠΎΠ² Π΄Π»Ρ ΠΏΠΎΠ»Ρ
sa_flagsstruct sigationSIG_IGNSIGCHLDΠΠ°ΠΊ ΠΈ Ρ ΡΠΈΠ³Π½Π°Π»Π°ΠΌΠΈ Π² ΠΎΠ±ΡΠ΅ΠΌ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π·Π΄Π΅ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΡ ΡΠ»ΠΎΠΆΠ½Ρ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ ΡΠ°Π·Π²ΠΈΠ²Π°Π»ΠΈΡΡ Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
10.8.3.1. ΠΠ»ΠΎΡ ΠΈΠ΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΠΈ: ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ²
ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π΄Π»Ρ
SIGCHLDSIG_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_NOCLDSTOPwait()Π ΠΎΠ±ΡΠ΅ΠΌ Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠΈΠ³Π½Π°Π»Ρ
SIGCHLDSIGCHLDSIGCHLDΠ‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°,
ch10-reap1.ΡSIGCHLD1 Β /* ch10-reap1.Ρ --- Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ SIGCHLD Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΈΠΊΠ»Π° */23 Β #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>910 #define MAX_KIDS 4211 #define NOT_USED -11213 pid_t kids[MAX_KIDS];14 size_t nkids = 0;ΠΠ°ΡΡΠΈΠ² ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ² ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ID ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΡΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ
NOT_USEDnkidskids16 /* format_num --- Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ [sf]printf() */1718 const char *format_num(int num)19 {20 #define NUMSIZ 3021 Β static char buf[NUMSIZ];22 Β int i;2324Β if (num <= 0) {25Β Β strcpy(buf, "0");26Β Β return buf;27Β }2829Β i = NUMSIZ - 1;30Β buf[i--] = '\0';3132Β /* ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΡΠΈΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΡΡΡΠΎΠΊΡ. */33Β do {34Β Β buf[i--] = (num % 10) + '0';35Β Β num /= 10;36Β } while (num > 0);3738 Β return &buf[i+1];39 }ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π°
printf()format_num()