В моей программе я слушаю входящие сигналы SIGCHLD, чтобы избежать зомби.
Код:
void myhandler(int signo)
{
printf("test");
int status;
pid_t pid;
while((pid = waitpid(-1, &status, WNOHANG)) > 0)
++count;
}
int main(int argc, char const *argv[])
{
struct sigaction sigchld_action;
memset(&sigchld_action,0,sizeof(sigchld_action));
sigchld_action.sa_handler = &myhandler;
sigaction(SIGCHLD,&sigchld_action,NULL);
if(fork() == 0){
exit(0);
}
if(fork()==0){
exit(0);
}
if(fork()==0){
exit(0);
}
while(wait(NULL) > 0)
++count;
return 0;
}
Проблема в том, что число разветвленных дочерних элементов и количество выходных данных printf (" test ") иногда не совпадает. Количество разветвленных потомков больше числа printf («test»).
Гарантирует ли этот сегмент кода, что зомби не будет? Если да, то как этого добиться? Это не печать правильного номера «теста». Неужели waitpid () очищает мертвых потомков более одного раза за это время?
Что происходит, когда вызывается этот обработчик сигнала, в то же время может умереть другой ребенок. Сигнал будет заблокирован по умолчанию (во время работы обработчика другой ребенок может d ie). Очищает ли waitpid процесс, сигнал которого отправляется, когда работает обработчик сигнала?
Кроме того, счетчик не равен. (stati c volatile int) или я попробовал атоми c целое число.