我有这段代码:
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
子进程将并行运行。我需要检查两个退出代码,无论它们是1
还是0
。我以为我可以使用这样的东西:
pid_t pid;
int status;
while( (pid = wait(&status)) > 0)
printf("%d exit code: %d\n", pid, WEXITSTATUS(status));
我是并行编程的新手,所以我不确定这是否是正确的解决方案。是否有可能在父进程到达周期之前有一个子进程退出,因此它不会获得退出代码?
答案 0 :(得分:2)
如果进程在父进程到达wait()
之前退出,它将成为defunct
进程(或zombie
进程)。这没关系,因为如果稍后调用wait
函数,它将获得退出代码并且僵尸进程将成功终止。
您可以使用wait()
等待特定进程(而不是等待任何进程),而不是使用等待任何进程的waitpid()
,因为您必须等待两个过程。
PID
wait()系统调用暂停执行调用进程,直到 其中一个孩子终止了。呼叫等待(& status)是等效的 到:
pid_t waitpid(pid_t pid, int *status, int options);
waitpid()系统调用暂停执行调用进程 直到由pid参数指定的子项已更改状态。默认情况下, waitpid()只等待已终止的子进程,但这种行为是 可通过options参数修改,如下所述。 pid的值可以是:
waitpid(-1, &status, 0);
表示等待进程组ID等于的任何子进程 pid的绝对值。
< -1
意思是等待任何子进程。
-1
表示等待进程组ID等于的任何子进程 调用过程的那个。
0
意味着等待进程ID等于其值的子进程 PID。
答案 1 :(得分:2)
如果一个或两个子进程在父进程首次调用wait()
之前退出,则操作系统将保留退出代码和/或终止原因,直到父进程到达wait()
。这正是“僵尸进程”的原因。
答案 2 :(得分:0)
见这里:http://linux.die.net/man/2/wait
wait()
将阻塞,直到两个进程中的一个结束,并返回有关该进程的信息。您可以在没有更多孩子的情况下拨打wait()
,也可以使用waitpid
获取有关特定PID的信息。
所以回答你的问题 - 你的代码看起来很好。 wait()
为你处理竞争条件,因为它会阻止执行,直到其中一个子项退出(或被其他方法停止)。