【发布时间】:2011-10-31 10:38:13
【问题描述】:
我有一个包含两个进程的程序。其中之一可能会因为异常而终止或退出。在测试程序时,我使用 Control+c 完成了它,但子进程仍在运行。
当我按下 control+c 或父进程终止时,是否有任何选项可以终止进程。
【问题讨论】:
-
你可以捕获 control + c (SIGINT),并且在信号处理程序中你可以杀死子进程..但是为了什么?
我有一个包含两个进程的程序。其中之一可能会因为异常而终止或退出。在测试程序时,我使用 Control+c 完成了它,但子进程仍在运行。
当我按下 control+c 或父进程终止时,是否有任何选项可以终止进程。
【问题讨论】:
没有选项可以自动执行此操作,但是您可以编写应用程序来支持它。一个先决条件是希望对方终止的进程必须有它的进程ID;这是父级从fork() 调用返回的值。
给每个进程一个 SIGINT 的信号处理程序 - 当按下 control-C 时,SIGINT 被发送到进程。在此信号处理程序中,将信号发送到您的其他进程,然后exit()。
【讨论】:
您可以在子进程上启动一个监听器,定期检查父进程是否仍在运行。
【讨论】:
您可以找到所有您需要的答案here。
例如,您可以 trap CTRL+C 并在 SIGINT 信号上运行一个子函数,该函数管理您想要退出或 kill 的方式> 正在运行的 PID。
非函数式例子说明原理
SIGINT=2
trap 'clean_exit' $SIGINT
# other thgs in your main prog
function clean_exit(){
# define SIGTERM and your $pid according to your need
kill -$SIGTERM $pid
#other things to do
}
【讨论】:
trap 'clean_exit' INT.