与父母一起杀死分叉的孩子进程?

问题描述

我正在使用基本的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的进程。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...