检查两个进程的退出代码

时间:2015-04-17 14:30:12

标签: c fork wait exit-code

我有这段代码:

  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));

我是并行编程的新手,所以我不确定这是否是正确的解决方案。是否有可能在父进程到达周期之前有一个子进程退出,因此它不会获得退出代码?

3 个答案:

答案 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()为你处理竞争条件,因为它会阻止执行,直到其中一个子项退出(或被其他方法停止)。