用于Windows的SIGCHLD替换

Mat*_*man 3 c windows winapi sigchld

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

我现在能想到的唯一解决方案是让孩子们看看他们是否还活着.

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

And*_*ers 5

如果您自己生成这些子进程,则可以使用Job对象,它们可以在作业的一部分进程结束时通知您.

使用JobObjectAssociateCompletionPortInformation并捕获JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESSJOB_OBJECT_MSG_EXIT_PROCESS.


Chr*_*s J 5

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

我假设您正在使用CreateProcess. 这将返回一个PROCESS_INFORMATION包含 member的结构hProcess。这是您创建的子进程的句柄。

从这里开始,您可以使用 等待此句柄WaitOnSingleObject,它将阻塞,直到给定的句柄发出信号为止(尽管如果您更愿意执行此非阻塞操作,它确实需要超时 - 它是select您将获得的最接近的等价物)。

如果您确实走多线程路线,那么您可以等待一个单独的线程,然后当WaitOnSingleObject通过时,您可以相应地通知父进程中的工作线程。

在单线程风格中,如果您使用select-style 语义,您将只是在循环中轮询句柄。

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

  • 我同意:这是等待孩子完成的**方式。在 MSDN 中也记录了一百万次。不要忘记 ::CreateProcess() 返回的 ::CloseHandle() ,无论您是否在等待它!关闭句柄不会影响子进程。 (2认同)