问题描述
我正在使用基本的unix命令从C执行shell脚本:
int pid=fork();
if (0>pid) {} //error
else if (0==pid) //child {
execv(...);
}
else { //parent
int status;
waitpid(pid,&status,0);
}
这可以按预期工作,但我想创建一个看门狗以防止执行的进程运行太多时间:
kill(pid,SIGTERM);
这也可以正常工作,但是如果脚本中有子级,则它们将成为孤立进程。
让我们考虑一下此脚本:
echo 's' | nc a.b.c.d p
当nc
(还有整个脚本)挂起并且我试图从代码中杀死它时,脚本将终止,但是nc
将成为孤儿并将永远呆在那里。
在bash中,我可以使用kill %n
终止进程及其子进程。用C做同样的事情是什么?
我也可以使用pkill -TERM -P parent_pid
。我正在用C / C ++代码寻找同样的东西。
解决方法
执行此操作的一种方法是使程序将孩子的pids注册到数组中,然后当您要杀死它们时,只需向父级发送信号即可。信号处理程序将遍历数组并杀死所有子项,然后杀死自身。重要的是要有一个处理程序来处理一个孩子何时终止的行为,这样当您尝试杀死所有孩子时,您不会杀死具有与该孩子以前相同的pid的进程。