2013-06-28 20 views
2

我想弄清楚当一个子进程(使用CreateProcess()在Windows上创建)崩溃或正常存在。我将Unix代码移植到Windows,并且有很多问题。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的进程产生一个新的线程(如果必须的话,我更喜欢拉入一个线程)。

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

+0

你是什么意思“最好?” –

+0

我想实现上面的行为,如果可能的话:主线程或一个线程,当子进程崩溃或终止正常时,所有子进程都会中断。这将是我最理想的情况。 – user1777907

+0

使用RegisterWaitForSingleObject。这注册了一个函数,当手柄被发信号时被调用。 –

回答

4

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

+0

太棒了,非常感谢!这对我来说是一个很好的解决方案。 – user1777907

+2

请注意,WaitForMultipleObjects最多有64个句柄,所以如果可以有63个以上的子进程,则需要将其分解为63个块。或者,您可以使用RegisterWaitForSingleObject,它可以为您执行所有操作。 –

+0

这是我不知道的重要考虑因素。谢谢! – user1777907