Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
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--] = ' ';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()