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

时间:2014-09-17 14:04:02

标签: c++ c linux process

美好的一天!我有一个通过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;
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

问题有两个:首先检查过程是否仍然存在是错误的。从waitpid manual page关于返回值:

  

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

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

第二个问题是您拨打waitpid两次。如果流程已经退出,那么您已经已经退出了#34;它与第一次调用,这就是为什么第二次调用会给你一个错误,因为子进程不再存在。