我试图弄清楚子进程(在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的进程生成一个新线程(如果必须,我更愿意拉入一个线程。)
在这种情况下,最好的解决方案是什么?
答案 0 :(得分:4)
实际上有一种方法可以中断WaitForMultipleObjects()
。使用CreateEvent()
创建指定的手动重置事件对象。包括WaitForMultipleObjects()
的事件句柄以及现有的子进程句柄。每次创建新的子进程时,都会使用SetEvent()
发出事件信号。这样,只要子进程退出(无论出于何种原因)或发出事件信号,就会退出WaitForMultipleObjects()
,然后您可以根据需要更新句柄列表,使用ResetEvent()
重置事件,并调用{{ 1}}再次。