产生的过程变得不复存在

时间:2009-04-16 09:31:48

标签: c++ spawning

我使用posix_spawnp从我的主进程生成子进程。

    int iRet = posix_spawnp(&iPID, zPath, NULL, NULL, argv, environ);   

    if (iRet != 0)
    {       
        return false;
    }

有时,在子进程产生没有错误之后,它突然变得不存在了。怎么会发生这种情况?

我使用信号处理程序来获取子进程:

void SigCatcher(int n)
{       
    while(waitpid( -1, NULL, WNOHANG ) > 0);        
}

每当我杀死一个子进程时,我都会手动调用它。

    kill(oProcID, SIGKILL);

    signal (SIGCHLD, SigCatcher);

这是否会导致生成的孩子失效(没有我叫杀)?

2 个答案:

答案 0 :(得分:2)

此:

kill(oProcID, SIGKILL);

signal (SIGCHLD, SigCatcher);

看起来像race condition。您需要在杀死子进程之前安装信号处理程序,否则可能会丢失信号。

答案 1 :(得分:1)

你有没有打电话:

signal(SIGCHLD, SigCatcher);

其他地方?

如果你还没有,那么你需要在产生任何子进程之前这样做,以确保这些子进程在终止时被收获。

正如Unwind指出的那样,您当前对killsignal的来电是错误的。

典型用途是:

signal(SIGCHLD, handler);
posix_spawnp(...);
...
// do other stuff
...
kill(pid, SIGKILL);