我的win32程序是否有办法告诉它启动的子进程已经崩溃(而不仅仅是退出)?
Is there a way for my win32 program to tell that the child process it launched has crashed (and not just exited)?
我编写了一个多平台c++类,它启动用户指定的子进程,并允许用户与子进程的stdin/stdout通信,等待子进程退出,等等。
在这个类的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;
}
…但我还没有弄清楚如何设置(retDidChildProcessCrash)使用Win32 API的适当值。
是否有办法做到这一点,或者我只需要在我的文档中注明此功能目前未在Windows下实现?
安排孩子与父母沟通以表示完成。共享事件是一种方式。如果进程终止,父进程没有收到成功的通知,那么它可以得出子进程失败的结论。
另一个选项可能是使用进程退出代码。如果孩子遵循常规,那么成功的概率为零。而崩溃将导致一个错误代码,表明崩溃的形式,根据这个问题:Windows中崩溃进程的可预测退出代码?
这是不太可靠的。进程可能因为调用了TerminateProcess
而终止,退出代码为0。所以如果你控制了两个过程,第一种方法更安全。如果您不控制子进程,那么退出代码可能是您最好的选择。从已终止进程的进程句柄中,您无法获得更多信息。
相关文章:
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 如何检测Poco子进程何时崩溃
- 当父NT服务被终止/崩溃时,终止子进程
- 在子进程中禁用崩溃对话框
- 我的win32程序是否有办法告诉它启动的子进程已经崩溃(而不仅仅是退出)?
- GenerateConsoleCtrlEvent 在子进程为 cmd 时崩溃