检查两个进程的退出代码
Posted
技术标签:
【中文标题】检查两个进程的退出代码【英文标题】:Checking exit codes of two processes 【发布时间】:2015-04-17 14:30:12 【问题描述】:我有这个代码:
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));
我是并行编程的新手,所以我不确定这是否是正确的解决方案。是不是有一个子进程在父进程到达循环之前退出的可能性,所以它不会得到退出代码?
【问题讨论】:
您的代码有什么问题?运行时会发生什么? 【参考方案1】:如果一个或两个子进程在父进程第一次调用wait()
之前退出,那么操作系统将保留退出代码和/或终止原因,直到父进程到达wait()
。这正是“僵尸进程”。
【讨论】:
谢谢,这就是我要找的答案。【参考方案2】:如果一个进程在父进程到达wait()
之前退出,它将成为defunct
进程(或zombie
进程)。这没关系,因为如果稍后调用wait
函数,它会得到那个退出代码,僵尸进程就会成功终止。
您可以使用waitpid()
等待特定的进程,而不是使用将等待任何进程的wait()
,这由其特定的PID
确定,因为您必须等待两个进程。
pid_t waitpid(pid_t pid, int *status, int options);
wait() 系统调用暂停调用进程的执行,直到 它的一个孩子终止。调用 wait(&status) 是等价的 到:
waitpid(-1, &status, 0);
waitpid() 系统调用挂起调用进程的执行 直到 pid 参数指定的孩子改变了状态。默认情况下, waitpid() 只等待终止的孩子,但这种行为是 可通过 options 参数进行修改,如下所述。 pid的值可以是:
< -1
意思是等待任何进程组ID等于的子进程 pid的绝对值。
-1
意思是等待任何子进程。
0
意思是等待任何进程组ID等于的子进程 调用进程的。
> 0
意思是等待进程ID等于值的子进程 pid。
【讨论】:
【参考方案3】:请看这里:http://linux.die.net/man/2/wait
wait()
将阻塞直到两个进程之一结束,并返回有关该进程的信息。您可以调用wait()
直到没有更多的孩子,或者使用waitpid
获取有关特定PID 的信息。
所以回答你的问题——你的代码看起来不错。 wait()
会为您处理竞争条件,因为它会阻止执行,直到其中一个孩子退出(或被其他方式停止)。
【讨论】:
以上是关于检查两个进程的退出代码的主要内容,如果未能解决你的问题,请参考以下文章
Process.Responding检测进程退出,同时进程运行
有没有办法获取早期管道 Scala 进程 (#|) 的退出代码?