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

时间:2013-06-28 22:29:16

标签: 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
        }
    }
}

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

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

1 个答案:

答案 0 :(得分:4)

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