当父进程使用Control+C结束时杀死子进程

3

我有一个包含两个进程的程序。其中一个可能因为异常而终止或退出。当我测试程序时,我使用Control+c结束程序,但子进程仍在运行。

是否有选项可以在我按下Control+c或父进程终止时杀死该进程?


你可以捕获 control + c (SIGINT) 信号,在信号处理程序中你可以杀死子进程。但是为了什么呢? - Krishnabhadra
3个回答

6

虽然没有自动化这一过程的选项,但您可以编写支持它的应用程序。前提是想要终止其他进程的进程必须拥有其进程ID; 这是父进程从fork()调用中返回的值。

为每个进程设置一个SIGINT信号处理器-当按下Control-C时,将向进程发送SIGINT。在此信号处理程序中,将信号发送到另一个进程,然后使用exit()退出。


1

您可以在子进程上启动一个监听器,定期检查父进程是否仍在运行。


3
如果有更好的解决方案,那么轮询就是不好的。 - bitmask

0

您可以在这里找到所有需要的答案。
例如,您可以捕获CTRL+C并在SIGINT信号上运行子函数,以管理您想要退出或杀死正在运行的PID(s)的方式。

非功能性示例以说明原理。

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” 部分可以更简洁地编写,不需要额外的变量:trap 'clean_exit' INT - Jacek Konieczny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接