有没有办法让我的 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 进程,那么退出代码可能是您最好的选择。您无法从已终止进程的进程句柄中获得更多信息。
我写了一个多平台的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 进程,那么退出代码可能是您最好的选择。您无法从已终止进程的进程句柄中获得更多信息。