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