2015-04-13 2 views
2

Программа изначально просит пользователя ввести количество дочерних процессов для создания. После создания детей родитель спит и ждет, пока все его дети прекратятся с помощью функции обработчика сигнала «handle_child», зарегистрированной в SIGCHLD.Родительский процесс не дожидается выхода всех детей с помощью сигнала()

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 

int to_kill; 

void handle_child(int sig) 
{ 
    pid_t id = wait(NULL); 
    printf("Reaped child with PID = %d\n",id); 
    --to_kill; 
    if(to_kill == 0){ 
     printf("~All children have been reaped successfully.. parent will now exit~\n"); 
     exit(0); 
    } 
} 

int main() 
{ 
    pid_t id, parent_id = getpid(); 
    int children, i; 
    signal(SIGCHLD, handle_child); 
    printf("Enter number of child processes to spawn: "); 
    scanf("%d",&children); 
    to_kill = children; 
    for(i = 0; i < children; ++i){ 
     id = fork(); 
     if(id == 0){ 
      printf("New child with pid = %d\n",getpid()); 
      sleep(2); 
      return 0; 
     } 
     sleep(1); 
    } 
    sleep(30); 
    return 0; 
} 

Проблема, с которой я сталкиваюсь, заключается в том, что родитель часто выходит, не пожиная всех своих детей. В некоторых случаях программа работает отлично, а в других случаях она резко заканчивается. Что здесь происходит?

Одним из примеров ошибочного вывода:

Enter number of child processes to spawn: 4 
New child with pid = 6458 
New child with pid = 6459 
Reaped child with PID = 6458 
New child with pid = 6461 
Reaped child with PID = 6459 
New child with pid = 6462 
Reaped child with PID = 6461 
[email protected]:~$ 

ответ

3

Я думаю, что вызов спать (30) прерывается SIGCHLD прерывания, поэтому он не будет спать в течение 30-х годов, но вернуться сразу же после того, как обработчик сигнала называется.

Чтобы получить это право вам нужно будет спать в цикле:

tosleep = 30; 
while (tosleep > 0) { 
    tosleep = sleep(tosleep); 
} 
+0

Спасибо, это решить эту проблему! Не знал, что sleep() прерывается из-за сигнала. – Nishad

Смежные вопросы