用于Windows的SIGCHLD替换

时间:2012-02-09 19:27:27

标签: c windows winapi sigchld

我想在Windows上使用SIGCHLD功能(即,当孩子死亡时通知父进程)。我知道Windows API中没有与SIGCHLD等效的东西,但我想知道用Windows实现这一点的常用方法是什么。我确信这是Windows开发人员经常遇到的问题。

我现在能想到的唯一解决办法是让孩子们看看他们是否还活着。

注意:我的应用程序是单线程的,如果可能的话我想保持这种方式。该应用程序具有非阻塞事件循环(使用select())。

2 个答案:

答案 0 :(得分:5)

如果您自己生成这些子进程,可以使用Job objects,他们可以在作业中的进程结束时通知您。

使用JobObjectAssociateCompletionPortInformation并抓住JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESSJOB_OBJECT_MSG_EXIT_PROCESS

答案 1 :(得分:4)

我不知道这是不是最好的方法,但这肯定是一种方式。

我假设您正在使用CreateProcess创建流程。这将返回包含成员PROCESS_INFORMATION的{​​{1}}结构。这是您创建的子进程的句柄。

从这里开始,您可以使用hProcess等待此句柄,该句柄将一直阻止,直到指定的句柄发出信号为止(尽管如果您更愿意执行此非阻塞,它确实需要超时 - 它是最接近的相当于WaitOnSingleObject你会得到的)。

如果你进入多线程路由,那么你可以等待一个单独的线程,然后当select通过时,你可以相应地通知父进程内的工作线程。

在单线程样式中,如果使用WaitOnSingleObject样式语义,则只需在循环中轮询句柄。

如果有几个子对象要等待(假设您已经在使用select),您可能需要考虑select - 如果这是您的代码的相关模型。