2014-09-03 78 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' – 2014-09-03 19:04:33

+0

你會需要一些方法來所有的子ID傳遞給所有的孩子們。否則,第二個孩子將無法等待所有尚未創建的孩子...... – twalberg 2014-09-03 19:10:24

+0

父進程正在啓動所有子進程。 wait()函數僅等待* current *進程的子進程。由最後一個孩子創建的代碼將終止,(其他孩子都不終止)導致父親終止(所有其他孩子仍然持有'等待(空)')I.E.所有的孩子都需要一些邏輯來使他們終止。一種方法是父親初始化一個常用變量,讓孩子繼續執行,然後在所有孩子生成後重置變量,以便孩子終止。 – user3629249 2014-09-04 20:20:26

回答

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; 
}