从Linux中的非子进程获取退出代码



您好!我有一个通过posix_spawn函数创建的进程。我怎样才能得到他的出口代码?

我知道waitpid()函数,但它返回子进程的状态。此外,如果进程仍然是活动的,我将调用waitpid()函数,那么我将收到该进程尚未关闭的正确信息。

这是我当前的代码:

int GetExitCode()
{
  int status;
  int rtn = waitpid(pid, &status, WNOHANG);
  if (rtn > 0) // still live
  {
    return -1;
  }
  rtn = waitpid(pid, &status, WUNTRACED);
  if (rtn != -1 || errno != ECHILD) 
  {
     // Here I got rtn = -1 and errno #10
  }
  if (WIFEXITED(status))
  {
    return EXIT_SUCCESS;
  }
  return EXIT_FAILURE;
}

但是如何检查非子进程的退出状态?谢谢

已更新。我的新代码:

int GetExitCode()
{
      int status = 0;
      int rtn = kill(pid, 0);
      if (rtn == -1 && errno == ESRCH)
      {
          return 0;
      }
      rtn = waitpid(pid, &status, WNOHANG | WUNTRACED | WCONTINUED);
      if (rtn == 0) // still live
      {
        return 0;
      }
      std::cout << "Probably success. Errno: " << errno << ". StrError: " << strerror(errno) << std::endl;
      if (WIFEXITED(status))
      {
        return 1;
      }
      return 0;
}

删除对waitpid的第二个调用,第一个调用获得状态(进程只能等待一次)。

问题有两个方面:首先检查进程是否仍然有效是错误的。从关于返回值的waitpid手册页面:

如果指定了WNOHANG,并且pid指定的一个或多个子(ren)存在,但尚未更改状态,则返回0。

由于您检查了大于零的值,这意味着您在进程退出时返回-1

第二个问题是您调用waitpid两次。如果进程已经退出,那么您已经用第一个调用"收获"了它,这就是为什么第二个调用会给您一个错误,因为子进程已经不存在了。

最新更新