2014-09-03 2 views
0

Моя программа должна создать n дочерних элементов. Когда сигнал получен, создается дочерний элемент. Затем первый ребенок ждет остальных n-1 детей. Второй ждет других n-2-детей и так далее, пока последний ребенок не запустится и не завершится немедленно. Я пишу этот код, но он не работает, и я получаю племянников.C: Ожидание завершения процесса брака

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <signal.h> 
#include <sys/wait.h> 
void func(int sign) 
{ 
    printf("received signal. I create a child\n"); 
} 

int main(int argc, char*argv[]) 
{ 
    if(argc!=3) 
    { 
     printf("error\n"); 
     return 0; 
    } 
    int i,pid,status; 
    int n=atoi(argv[1]); 
    unsigned int m=(unsigned int)atoi(argv[2]); 
    signal(SIGALRM,func); 
    printf("i'm father: pid %d\n",getpid()); 
    for(i=0; i<n; i++) 
    { 
     alarm(m); 
     pause(); 
     switch(pid=fork()) 
     { 
     case -1: 
      printf("error\n"); 
      break; 
     case 0: 
      printf("i'm the hild numer %d, my pid is %d\n",i,getpid()); 
      if(i!=n-1) 
      { 
       wait(NULL); 
       break; 
      } 
      else 
      { 
       printf("%d i have fnished\n",getpid()); 
       exit(0); 
      } 
      break; 
     default: 
      wait(NULL); 
      break; 
     } 
    } 
    printf("finish\n"); 
    return 0; 
} 
+0

Правильный термин назвать это 'ребенок process' –

+0

Вы будете нуждаться в какой-то способ, чтобы передать все идентификаторы детей для всех детей. В противном случае у второго ребенка не будет возможности ждать всех детей, которые еще не созданы ... – twalberg

+0

Все дочерние процессы запускаются процессом отца. Функция wait() ожидает только детей * текущего * процесса. Код, выполняемый последним созданным ребенком, завершится, (ни один из остальных детей не завершится), в результате чего отец прекратит работу (все остальные дети все еще удерживают «ожидание» (NULL) »). I.E. все дети нуждаются в некоторой логике, чтобы заставить их прекратить работу. Один из способов - это общая переменная, которую отец инициализирует, чтобы дети продолжали выполнять, а затем после того, как все дети сгенерированы, сбросьте переменную, чтобы дети закончили. – user3629249

ответ

1

Как структурирован ваш код, вы создаете процессы 2^N.

Вы должны изменить код под:

default: 
    wait(NULL); 
    break; 

к чему-то, что не раскошелиться больше детей после этого. Один из способов сделать это - использовать оператор goto. Вот обновленная версия.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <signal.h> 
#include <sys/wait.h> 

void func(int sign) 
{ 
    printf("received signal. I create a child\n"); 
} 

int main(int argc, char*argv[]) 
{ 
    if(argc!=3) 
    { 
     printf("error\n"); 
     return 0; 
    } 
    int i,pid,status; 
    int n=atoi(argv[1]); 
    unsigned int m=(unsigned int)atoi(argv[2]); 
    signal(SIGALRM,func); 
    printf("i'm father: pid %d\n",getpid()); 
    for(i=0; i<n; i++) 
    { 
     alarm(m); 
     pause(); 
     switch(pid=fork()) 
     { 
     case -1: 
      printf("error\n"); 
      break; 

     case 0: 
      printf("i'm the child numer %d, my pid is %d\n",i,getpid()); 
      if(i!=n-1) 
      { 
       wait(NULL); 
       break; 
      } 
      else 
      { 
       printf("%d i have fnished\n",getpid()); 
       exit(0); 
      } 
      break; 

     default: 
      wait(NULL); 
      goto done; 
     } 
    } 

done: 
    printf("%d i have fnished\n",getpid()); 
    return 0; 
} 
Смежные вопросы