Windows:当子进程崩溃或正常退出时通知

3
我正在尝试弄清楚一个子进程(在Windows上使用CreateProcess()创建)何时崩溃或正常退出。我正在将Unix代码移植到Windows上,并且遇到了很多问题。
在Unix上,我使用SIGCHLD,如下所示:
struct sigaction act;
bzero(&act, sizeof(act));
act.sa_handler = sig_handler;
act.sa_flags = SA_RESTART;
sigaction(SIGCHLD, &act, 0);

void sig_handler(int signal)
{
    int pid, status;

    if (signal == SIGCHLD) {
        while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
            // Remove pid from a data structure
        }
    }
}

我在查看创建调用WaitForMultipleObjects的新线程的解决方案,但问题是新进程可以随时被创建,而且我不认为我可以在创建新进程时中断WaitForMultipleObjects。我不想为每个具有WaitOnSingleObject的进程产生一个新线程(如果必须,我更喜欢只拉入单个线程)。
请问在这种情况下最好的解决方案是什么?

“Best” 是什么意思? - Robert Harvey
如果可能的话,我希望实现上述行为:对于所有子进程,主线程或一个线程在子进程崩溃或正常终止时被中断。那将是我的最理想情况,请尽力实现。 - user1777907
使用RegisterWaitForSingleObject。这将注册一个函数,当句柄被信号时调用该函数。 - Raymond Chen
1个回答

5

实际上有一种方法可以中断WaitForMultipleObjects()。使用CreateEvent()创建指定的手动重置事件对象。将事件句柄与现有的子进程句柄一起包含在WaitForMultipleObjects()中。每次创建新的子进程时,使用SetEvent()发出信号。这样,WaitForMultipleObjects()会在任何一个子进程退出(无论什么原因),或者事件被触发时退出,然后您可以根据需要更新句柄列表,使用ResetEvent()重置事件,并再次调用WaitForMultipleObjects()


太棒了,非常感谢!这对我来说是一个很好的解决方案。 - user1777907
2
请注意,WaitForMultipleObjects 最多只能处理 64 个句柄,因此如果您有超过 63 个子进程,则需要将其分成 63 个一组。或者您可以使用 RegisterWaitForSingleObject,它会为您完成所有这些操作。 - Raymond Chen
那是我不知道的一个重要考虑因素。谢谢! - user1777907
我已经把所有东西都实现并且运行良好了,这太棒了 :) 非常清晰,谢谢! - user1777907

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