我想在 Windows 上具有 SIGCHLD 功能(即,当孩子死亡时通知父进程)。我知道 Windows API 中没有与 SIGCHLD 等效的东西,但我想知道用 Windows 实现它的常用方法是什么。我确信这是 Windows 开发人员经常遇到的问题。
我现在能想到的唯一解决方案是轮询孩子们,看看他们是否还活着。
注意:我的应用程序是单线程的,如果可能的话,我希望保持这种状态。该应用程序有一个非阻塞事件循环(使用 select())。
如果您自己生成这些子进程,则可以使用Job objects,它们可以在属于您的作业的一部分的进程结束时通知您。
使用JobObjectAssociateCompletionPortInformation并捕获JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS
or JOB_OBJECT_MSG_EXIT_PROCESS
。
我不知道这是否是最好的方法,但这肯定是一种方法。
我假设您正在使用CreateProcess
. 这将返回一个PROCESS_INFORMATION
包含 member 的结构hProcess
。这是您创建的子进程的句柄。
从这里,您可以使用 等待此句柄WaitOnSingleObject
,这将阻塞直到给定句柄发出信号(尽管如果您希望执行此非阻塞操作,它确实需要超时 - 它是select
您将获得的最接近的等价物)。
如果你确实走多线程路线,那么你可以在一个单独的线程上等待,然后当WaitOnSingleObject
通过时,你可以相应地通知父进程中的工作线程。
在单线程样式中,如果您使用select
-style 语义,您将只是在循环中轮询句柄。
如果您有几个子对象要等待(假设您已经在使用 select),您可能需要考虑WaitForMultipleObjects
- 如果这是您的代码的相关模型。