有没有办法让我的 win32 程序知道它启动的子进程已经崩溃(而不仅仅是退出)?

Is there a way for my win32 program to tell that the child process it launched has crashed (and not just exited)?

我写了一个多平台的C++class启动一个用户指定的子进程,让用户与子进程的stdin/stdout通信,等待子进程退出,然后依此类推

在这个 class 的 Unix/POSIX 实现中,我刚刚添加了一个功能,让调用者查明子进程的退出是否是由于未处理的信号(即崩溃) :

bool ChildProcessDataIO :: WaitForChildProcessToExit(bool & retDidChildProcessCrash)
{
  int status = 0;
  int pid = waitpid(_childPID, &status, 0);
  if (pid == _childPID)
  {
     retDidChildProcessCrash = WIFSIGNALED(status);
     return true;
  }
  else return false;  // error, couldn't get child process's status
}

...现在我想向 Windows 实现添加类似的功能,目前看起来像这样:

bool ChildProcessDataIO :: WaitForChildProcessToExit(bool & retDidChildProcessCrash)
{
   bool ret = (WaitForSingleObject(_childProcess, INFINITE) == WAIT_OBJECT_0);
   if (ret) 
   {
      /* TODO:  somehow set (retDidChildProcessCrash) here */
   }
   return ret;
}

...但我还没有弄清楚如何使用 Win32 API.

将 (retDidChildProcessCrash) 设置为适当的值

有什么方法可以做到这一点,还是我只需要在我的文档中注明此功能当前未在 Windows 下实现?

安排 child 与 parent 通信以指示完成。共享事件将是一种方式。如果进程终止并且 parent 没有收到成功通知,那么它可以断定 child 失败了。

另一种选择可能是使用进程退出代码。假设 child 遵循通常的约定,则成功将为零。并且崩溃会导致错误代码指示崩溃的形式,根据这个问题:?

虽然这不太可靠。一个进程可能会终止,因为它有 TerminateProcess 调用它,退出代码为零。因此,如果您控制这两个过程,第一种方法更安全。如果您不控制 child 进程,那么退出代码可能是您最好的选择。您无法从已终止进程的进程句柄中获得更多信息。