检查两个进程的退出代码

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 进程 (#|) 的退出代码?

C#/.Net 启动进程,退出代码为 -2146234327

setPixmap 导致进程以退出代码 1 完成 [重复]

如何验证两个检查点之间是否已释放所有内存分配?

从命名管道捕获非零退出代码