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

use*_*907 3 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 sig_handler(int signal)
{
    int pid, status;

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

我正在研究创建一个调用 WaitForMultipleObjects 的新线程的解决方案,但问题是可以随时创建新进程,我认为在创建新进程时我不能中断 WaitForMultipleObjects。我不想为每个具有 WaitOnSingleObject 的进程生成一个新线程(如果必须的话,我更愿意引入一个线程)。

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

gla*_*lig 5

其实是有办法打断的WaitForMultipleObjects()。使用CreateEvent().创建指定的手动重置事件对象。将事件句柄WaitForMultipleObjects()与您现有的子进程句柄一起包括在内。SetEvent()每次创建新的子进程时都会向事件发出信号。这样,WaitForMultipleObjects()只要子进程退出(无论出于何种原因)或事件发出信号,就退出,然后您可以根据需要更新句柄列表,使用 重置事件ResetEvent(),然后WaitForMultipleObjects()再次调用。

  • 请注意,WaitForMultipleObjects 最多有 64 个句柄,因此如果您可以拥有 63 个以上的子进程,则需要将其分解为 63 个。或者您可以使用 RegisterWaitForSingleObject 为您完成所有这些。 (2认同)