2014-10-01 69 views
2

我在循環中創建多個子進程。 每個孩子都會做這件事,任何人都可以先結束。 (不確定是否相關但是:每個孩子也有孫子)C - 等待一個孩子終止

如何等待任何子進程終止並在完成後停止其他進程?

for(i=0; i<numberOfChildren; i++) 
{ 
    pid = fork(); 
    if(pid < 0) 
    { 
     fprintf(stderr, "Error: fork Failed\n"); 
     return EXIT_FAILURE; 
    } 
    /* Child Process */ 
    if(pid == 0) 
    { 
     /* Do your thing */ 
    } 
    /* Parent process */ 
    else 
    { 
     childrenPid[i]=pid; 
    } 
} 
+0

當你的父母正在循環查看哪些子進程退出時,使用WNOHANG做一個非阻塞的waitpid(),然後查看返回值以查看一個給定的子是否退出 - 我更喜歡這個等待孩子們乾乾淨淨地離開。 – JohnH 2014-10-01 19:45:28

回答

3

您可以暫停父,直到它的一個子終止與wait呼叫,然後kill剩下的孩子:

#include <sys/types.h> 
#include <wait.h> 

int status; 
childpid = wait(&status) 

然後,如果你已經保存您創建的所有兒童的進程ID在一個數組,你可以殺死剩下的孩子:

#include <sys/types.h> 
#include <signal.h> 

for(i = 0; i < nchildren; i++) 
    if (children[i] != childpid) 
     kill(children[i],SIGKILL) 

其中nchildren是怒江的整數計數mber創建的孩子,children是創建的孩子的pid_t數組。