0

我使用 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);

这会导致产卵的孩子不复存在(没有我打电话给杀戮)吗?

4

2 回答 2

3

这:

kill(oProcID, SIGKILL);

signal (SIGCHLD, SigCatcher);

看起来像一个比赛条件。您需要在终止子进程之前安装信号处理程序,否则您可能会丢失信号。

于 2009-04-16T09:38:44.527 回答
1

你有没有打电话:

signal(SIGCHLD, SigCatcher);

其他地方?

如果您还没有,那么您需要在任何子进程甚至生成之前执行此操作,以确保这些子进程在它们终止时被收割。

正如 Unwind 指出的那样,您当前对kill和的调用signal是错误的。

典型用途是:

signal(SIGCHLD, handler);
posix_spawnp(...);
...
// do other stuff
...
kill(pid, SIGKILL);
于 2009-04-16T09:44:43.123 回答