Windows下的SIGCHLD替代方案

4
我希望在Windows上实现SIGCHLD功能(即当子进程死亡时通知父进程)。我知道Windows API中没有相应的SIGCHLD,但我想知道在Windows上实现此功能的常见方法。我相信这是Windows开发人员经常遇到的问题。
我目前能想到的唯一解决方案涉及轮询子进程以查看它们是否仍然存活。
注意:我的应用程序是单线程的,如果可能的话,我希望保持这种状态。该应用程序具有非阻塞事件循环(使用select())。
2个回答

5

由于“select”不是信号的良好替代品,而且您的方法不需要为每个进程生成一个线程,我认为您的方法最接近在Windows中获得SIGCHLD的方法,谢谢。 - dashesy

5

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

我假设您正在使用CreateProcess创建进程。它会返回一个PROCESS_INFORMATION结构,其中包含成员hProcess。这是对您创建的子进程的句柄。

从这里开始,您可以使用WaitOnSingleObject等待此句柄,它将阻塞,直到给定句柄被信号通知(虽然如果您更喜欢非阻塞,则可以设置超时 - 这是您将获得的最接近select的等效项)。

如果您选择多线程路线,则可以在单独的线程上等待,然后当WaitOnSingleObject通过时,可以相应地通知父进程中的工作线程。

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

如果您有几个子对象要等待(考虑到您已经使用了select),则可以考虑使用WaitForMultipleObjects - 如果这是您代码的相关模型。


1
这条路线比我的答案少了工作量,如果你只关心(并需要等待)一个孩子,那么它是很好的选择,但是如果你需要关于孙子的信息,或者孩子进程不等待它的子进程,那么你就需要一个作业对象。 - Anders
2
我同意:这是等待子进程完成的唯一方法。在MSDN上已经有无数次记录了。不要忘记关闭由::CreateProcess()返回的句柄,无论你是否在等待它!关闭句柄不会影响子进程。 - kkm
有没有办法用完成端口来实现这个?我需要等待可能超过64个子进程。 - Matt Fichman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接