我使用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);
这是否会导致生成的孩子失效(没有我叫杀)?
答案 0 :(得分:2)
此:
kill(oProcID, SIGKILL);
signal (SIGCHLD, SigCatcher);
看起来像race condition。您需要在杀死子进程之前安装信号处理程序,否则可能会丢失信号。
答案 1 :(得分:1)
你有没有打电话:
signal(SIGCHLD, SigCatcher);
其他地方?
如果你还没有,那么你需要在产生任何子进程之前这样做,以确保这些子进程在终止时被收获。
正如Unwind指出的那样,您当前对kill
和signal
的来电是错误的。
典型用途是:
signal(SIGCHLD, handler);
posix_spawnp(...);
...
// do other stuff
...
kill(pid, SIGKILL);