【问题标题】: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));

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

【问题讨论】:

  • 您的代码有什么问题?运行时会发生什么?

标签: c fork wait exit-code


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 2019-12-19
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      相关资源
      最近更新 更多