Π‘ΡΡΠΎΠΊΠΈ 99β100 ΡΠΎΠ·Π΄Π°ΡΡ Π½Π°Π±ΠΎΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΡ
SIGCHLDΠ‘ΡΡΠΎΠΊΠΈ 104β109 ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΡΡ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π·Π°ΡΡΠΏΠ°Π΅Ρ Π½Π° ΡΡΠΈ ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΠΎ Ρ ΠΎΠ΄Ρ Π΄Π΅Π»Π° ΠΎΠ½ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΠΌΠ°ΡΡΠΈΠ²
kidsnkidsΠ‘ΡΡΠΎΠΊΠ° 111 Π΄Π°Π΅Ρ Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΌΠΊΠ°ΠΌ ΡΠ°Π½Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ, Π·Π°ΡΠ½ΡΠ² Π½Π° Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠΈΠΉ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΠΊ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. (ΠΡΠΎ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡ, Π½ΠΎ ΡΠ°Π½ΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π²Π΅Π»ΠΈΠΊΠΈ.)
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΡΡΡΠΎΠΊΠΈ 113β114 Π²ΡΠ²ΠΎΠ΄ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ, Π·Π°ΠΌΠ΅Π½ΠΈΠ² ΠΌΠ°ΡΠΊΡ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ
SIGCHLDSIGCHLD$ <b>ch10-reap1</b> /* ΠΠ°ΠΏΡΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */waiting for signalEntered childhandlerΒ reaped process 23937Β reaped process 23938Β reaped process 23939Β reaped process 23940Β reaped process 23941Exited childhandlerΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° ΡΠΎΠ±ΠΈΡΠ°Π΅Ρ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ°Ρ Π·Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡ ΠΎΠ΄.
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°,
ch10-reap2.cch10-reap1.cSIGCHLDSIGCHLD1Β /* ch10-reap2.c β Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ SIGCHLD, ΠΎΠ΄ΠΈΠ½ ΡΠΈΠ³Π½Π°Π» Π½Π° ΠΏΠΎΡΠΎΠΌΠΊΠ° */2Β Β /* ...Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ²ΡΠΈΠΉΡΡ ΠΊΠΎΠ΄ ΠΏΡΠΎΠΏΡΡΠ΅Π½... */1213 pid_t kids[MAX_KIDS];14 size_t nkids = 0;15 size_t kidsleft = 0; /* <<< ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ */16Β /* ...Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ²ΡΠΈΠΉΡΡ ΠΊΠΎΠ΄ ΠΏΡΠΎΠΏΡΡΠ΅Π½... */4142 /* childhandler --- ΠΏΠ΅ΡΠ΅Ρ
Π²Π°Ρ SIGCHLD, ΠΎΠΏΡΠΎΡ Π²ΡΠ΅Ρ
Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ² */4344 void childhandler(int sig)45 {46Β int status, ret;47Β int i;48Β char buf[100];49Β static const char entered[] = "Entered childhandler\n";50Β static const char exited[] = "Exited childhandler\n";5152Β write(1, entered, strlen(entered));53Β for (i = 0; i < nkids; i++) {54Β Β if (kids[i] == NOT_USED)55Β Β Β continue;5657Β retry:58Β if ((ret = waitpid(kids[i], &status, WNOHANG)) == kids[i]) {59Β Β strcpy(buf, "\treaped process ");60 Β Β strcat(buf, format_num(ret));61Β Β strcat(buf, "\n");62Β Β write(1, buf, strlen(buf));63 Β kids[i] = NOT_USED;64Β Β kidsleft--; /* <<< ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ */65Β } else if (ret == 0) {Β Β Β /* ...Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ²ΡΠΈΠΉΡΡ ΠΊΠΎΠ΄ ΠΏΡΠΎΠΏΡΡΠ΅Π½... */80Β write(1, exited, strlen(exited));81Β }ΠΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ Π·Π° ΡΠ΅ΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ Π½ΠΎΠ²Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ,
kidsleft83Β /* main --- ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΡΠ½ΠΎΡΡΡΠ΅ΠΉΡΡ ΠΊ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ ΡΠ²Π΅Π΄Π΅Π½ΠΈΠΉΒ Β Β Β Β Β ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ², ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΡ
ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² */8485 Β int main(int argc, char **argv)86Β {Β Β Β Β /* ...Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ²ΡΠΈΠΉΡΡ ΠΊΠΎΠ΄ ΠΏΡΠΎΠΏΡΡΠ΅Π½... */100101Β sigemptyset(&childset);102Β sigaddset(&childset, SIGCHLD);103104Β /* sigprocmask(SIG_SETMASK, &childset, NULL); /* Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠ΄Π΅ main */105106Β for (nkids = 0; nkids < 5; nkids++) {107Β Β if ((kids[nkids] = fork()) == 0) {108Β Β Β sleep(3);109Β Β Β _exit(0);110Β Β }111Β Β kidsleft++; /* <<< Added */112Β }113114Β /* sleep(5); /* Π΄Π°ΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠ°ΠΌ ΡΠ°Π½Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ */115116Β while (kidsleft > 0) { /* <<< ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ */117Β Β printf("waiting for signals\n");118Β Β Β sigsuspend(&emptyset);119Β } /* <<< ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ */120121Β 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