Windows:子系统死亡时的通知(崩溃或正常退出)

Windows:子系统死亡时的通知(崩溃或正常退出),windows,process,Windows,Process,我试图找出子进程(在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 si

我试图找出子进程(在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的进程生成一个新线程(如果必须的话,我更愿意引入一个线程)


在这种情况下,最好的解决方案是什么?

实际上有一种方法可以中断
WaitForMultipleObjects()
。使用
CreateEvent()
创建指定的手动重置事件对象。包括
WaitForMultipleObjects()
的事件句柄以及现有子进程句柄。每次创建新的子进程时,用
SetEvent()
向事件发送信号。这样,每当子进程退出(无论出于何种原因)或事件发出信号时,
WaitForMultipleObjects()
就会退出,然后您可以根据需要更新句柄列表,使用
ResetEvent()
重置事件,并再次调用
WaitForMultipleObjects()

您所说的“最佳”是什么意思如果可能的话,我想实现上面的行为:对于所有子进程,当子进程崩溃或正常终止时,主线程或一个线程会被中断。这将是我最理想的情况。请使用RegisterWaitForSingleObject。它注册了一个函数,当句柄发出信号时将被调用。太棒了,非常感谢!这对我来说是一个很好的解决方案。请注意,WaitForMultipleObjects最多有64个句柄,因此如果您可以有63个以上的子进程,则需要将其拆分为63个。或者你可以使用RegisterWaitForSingleObject来完成所有这些,这是我不知道的一个重要考虑因素。谢谢我得到了所有的实施和工作,这是伟大的:)非常清楚,谢谢!