2015-04-17 47 views
1

我有这样的代码:检查两个进程的退出码

pid_t pid1 = fork(); 

    if (pid1 == 0) 
    { 
    //do some stuff 
    if (something) 
     exit(0); 
    else 
     exit(1); 
    } 
    else if (pid1 == -1) 
    printf("error\n"); 

    pid_t pid2 = fork(); 

    if (pid2 == 0) 
    { 
    //do some stuff 
    if (something) 
     exit(0); 
    else 
     exit(1); 
    } 
    else if (pid2 == -1) 
    printf("error\n"); 

//here I want to check both exit codes 

子进程将并行运行。我需要的是检查退出代码是否是10。我以为我可以使用这样的:

pid_t pid; 
int status; 
while((pid = wait(&status)) > 0) 
    printf("%d exit code: %d\n", pid, WEXITSTATUS(status)); 

我新的并行程序,所以我不知道这是一个正确的解决方案。在父进程到达循环之前,其中一个子进程没有退出的可能性,因此它不会得到退出代码?

+1

你的代码有什么问题?当你运行它会发生什么? –

回答

2

如果一个或两个孩子的处理退出父首先调用wait()之前,则该操作系统将直到父达到wait()按住退出代码和/或理由终止。这正是“僵尸进程”的意义所在。

+0

谢谢你,那是我正在寻找的答案。 – sykatch

0

在这里看到:http://linux.die.net/man/2/wait

wait()将阻塞,直到两个过程的一个结束,有关该过程的返回信息。您可以拨打wait(),直到没有更多的孩子,或者使用waitpid获取有关特定PID的信息。

因此,要回答你的问题 - 你的代码看起来不错。 wait()负责照顾您的竞争条件,因为它会阻止执行,直到其中一个孩子退出(或以其他方式停止)。

2

如果一个进程在父进程到达wait()之前退出,它将变为defunct进程(或zombie进程)。这是可以的,因为如果稍后调用wait函数,它将得到该退出代码并且僵尸进程将成功终止。

而不是使用wait()这将只是等待任何过程中,你可以使用waitpid()等待一个特定的进程,通过其特定PID确定,因为你必须等待两个过程。

pid_t waitpid(pid_t pid, int *status, int options);

的等待()系统调用挂起调用进程的执行,直到 一个其子女的终止。呼叫等待(&状态)相当于 到:

waitpid(-1, &status, 0);

的waitpid函数()系统调用挂起调用过程 的执行,直到由PID参数指定的子状态发生了改变。默认情况下, waitpid函数()等待只为终止的孩子,但这种行为是 通过选项参数修改,如下所述。 PID值可以是:

< -1

任意子进程,其进程组ID等于 的PID绝对值意思的等待。

-1

意味着等待任何子进程。

0

意味着等待任何子进程,其进程组ID等于 调用进程的。

> 0

意味着等待其进程ID等于 PID值的孩子。