2013-11-05 36 views
0

我想要做一些事情有四個平行的過程使用觀望等待終究過程完成,但奇怪的輸出

我第一叉onec,又在孩子和家長叉拿到4點的過程。

我要的是做一些事情後,所有的4個過程完成,所以我用了waitpid(-1, &status, 0);

和我的理想輸出是

in 

numbers 

out 

但實際產量可能有時

in 

numbers 

out 

one number 

我無法弄清楚。

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/time.h> 
#include <error.h> 

int main() 
{ 
    pid_t cpid, w; 
    int status; 

    printf("%s\n", "in"); 
     cpid = fork(); 
     if (cpid == 0) 
     { 
      cpid = fork(); 
      if (cpid == 0) 
      { 
      printf("%s\n", "1"); 
      exit(EXIT_SUCCESS); 
      } 
      else{ 
      printf("%s\n", "2"); 
      exit(EXIT_SUCCESS); 
      } 
     } 
     else{ 
      cpid = fork(); 
      if (cpid == 0) 
      { 
      printf("%s\n", "3"); 
      exit(EXIT_SUCCESS); 
      } 
      else{ 
       printf("%s\n", "4"); 
       //exit(EXIT_SUCCESS); 
      }  
     } 
     waitpid(-1, &status, 0); 
     printf("%s\n", "out"); 
     //do something 
     exit(EXIT_SUCCESS); 
    return 0 ; 
} 

回答

2

您正在使用waitpid函數()PID = -1。它等待任何子進程完成。這意味着,只要任何一個子進程結束,父進程的waitpid()將退出。它不會等待任何其他子進程完成。

0

更好的方法來處理您的方案是通過在主進程中使用「SIGCHLD」的signale處理程序,並使用wait/waitpid來獲取子出口的情況。在這種情況下,您的所有孩子的死亡都可以被監控/通知,因爲SIGCLD將交付給主流程。