什么是杀死父母的所有过程而不是父母的最佳方法?假设我有一个未确定数量的子进程,我已经分叉并且在给定的警报上,在我的信号处理程序中,我想要杀死我的所有子进程但是由于各种原因让自己运行 .
截至目前,我正在使用kill(-1 * parentPid,SIGKILL)但这会杀死我的父母及其子女 .
实现此目的的一种方法是提供一些可以捕获的信号(而不是 SIGKILL ) . 然后,安装一个信号处理程序,检测当前进程是否是父进程,如果它不是父进程,则调用 _exit() .
SIGKILL
_exit()
您可以使用 SIGUSR1 或 SIGUSR2 ,或者可能使用 SIGQUIT .
SIGUSR1
SIGUSR2
SIGQUIT
我已经说明了这种技术here .
(可选)(如Lidong所示),父进程可以在发出 kill() 命令之前对信号使用 SIG_IGN .
kill()
SIG_IGN
signal(SIGQUIT, SIG_IGN); kill(-parent_pid, SIGQUIT);
Jxh的回答很好 . 然而,也许你可以在 fork 之后给每个子进程一个 signal hander 并让它调用 exit 函数 . 然后你给父母一个 signal hander 并让它 ignore 信号(如 SIGUSR1 ) . 这可能会添加代码行,但您不需要检测进程是信号处理函数中的父代或子代 .
fork
signal hander
exit
ignore
2 回答
实现此目的的一种方法是提供一些可以捕获的信号(而不是
SIGKILL
) . 然后,安装一个信号处理程序,检测当前进程是否是父进程,如果它不是父进程,则调用_exit()
.您可以使用
SIGUSR1
或SIGUSR2
,或者可能使用SIGQUIT
.我已经说明了这种技术here .
(可选)(如Lidong所示),父进程可以在发出
kill()
命令之前对信号使用SIG_IGN
.Jxh的回答很好 . 然而,也许你可以在
fork
之后给每个子进程一个signal hander
并让它调用exit
函数 . 然后你给父母一个signal hander
并让它ignore
信号(如SIGUSR1
) . 这可能会添加代码行,但您不需要检测进程是信号处理函数中的父代或子代 .