Процесс нафоркал пятерых детей. У процесса есть обработчик сигнала SIGCHLD (сигнал о том, что кто-то из детей подох) такого вида:void handler(int signo) {
pid_t pid;
int stat;
pid = wait(&stat);
printf("child %d terminated", pid);
return;
}
Проблема в том, что если пять детей подохнут одновременно, то в родителю будет кинуто пять похоронок (SIGCHLD). Первая из них спровоцирует начало выполнения обработчика сигнала SIGCHLD - handler-а. Во время выполнения handler-а остальные сигналы, ни о чем не подозревая, прилетят родителю и как об стенку горох. Тогда берем и пишем такое:
void handler(int signo) {
pid_t pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0) printf("child %d terminated\n", pid);
return;
}
Типа чтобы побольше зацепить зомбаков при выполнении обработчика?
А что будет, если SIGCHLD прилетит после несрабатывания бесконечного цикла, но еще перед возвратом в подпрограмму, которая была прервана началом выполнения обработчика? Тоже об стенку горох?
Блин, как же обработать гарантированно все сигналы?