2014-10-02 2 views
0

Я создаю программу, которая создает много детей из одного родителя. Я не хочу, чтобы больше детей создавалось, если произошла ошибка, выполнявшая exec. Следующий код по-прежнему продолжает создавать дочерние элементы даже после сбоя exec.убить дочерний процесс, если exec не работает

void synch_signal (int sig) 
{ 
    fprintf(stderr,"%s","ERROR"); 
    exit(0); 
} 


void create_children(int numberOfChildren, char **argc){ 
    struct sigaction usr_action; 

    usr_action.sa_handler = synch_signal; 
    sigaction (SIGUSR1, &usr_action, NULL); 

    int pid = 0; 
    char mystring[100] = { 0 }; 

    for (i; i <numberOfChildren; i++){ 


     //removed for simplicity. 

     pid = fork(); 

     if (pid){  
      //removed  
     } 
     else { 
      //removed 
      exec(...); 
      //exec failed 
      kill (getppid(), SIGUSR1); 
     } 


    } 


} 

благодаря Даниель

+0

Вы пытались сменить 'SIGUSR1' на' SIGTERM'? – SSC

+0

@SSC, yup. то же самое – dgamma3

ответ

3

Вы должны добавить оператор возврата после kill(), в противном случае дочерний процесс будет цикл снова после завершения функции kill() и становится родителем.