【问题标题】:Get exit code from non-child process in Linux从 Linux 中的非子进程获取退出代码
【发布时间】:2014-09-17 14:04:01
【问题描述】:

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

【问题讨论】:

  • posix_spawn 函数与fork 一样返回一个进程ID,这意味着您可以使用普通的wait 系列函数。事实上,创建的进程你的进程的一个子进程,就像你用fork创建一个进程一样。
  • @JoachimPileborg:我认为这应该是一个答案。这个问题的全部基础似乎是OP对“子进程”的含义感到困惑。
  • 如果是这样,那么为什么 waitpid 返回错误代码 10 "No child processes" ?我希望看到终止状态......我在哪里犯了错误?谢谢
  • 您能否在您的问题中添加一些代码以显示您在做什么? Minimal, Complete, and Verifiable example 将是完美的。
  • 抱歉,第一篇文章已更新

标签: c++ c linux process


【解决方案1】:

去掉第二次调用waitpid,第一次得到状态(只能等待一个进程一次)。

【讨论】:

【解决方案2】:

问题有两个方面:首先,您检查进程是否仍然存在是错误的。来自waitpid manual page的关于返回值:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 2012-01-05
    • 1970-01-01
    • 2013-04-18
    • 2010-12-06
    • 1970-01-01
    • 2020-06-20
    相关资源
    最近更新 更多