我需要我的程序通过捕获SIGTERM信号来正常终止所有进程,甚至是CTRL + C(我认为是SIGINT)。我如何对其进行修改以使其起作用? 我尝试只发布必要的代码,以免在程序运行时造成混乱,而我只需要添加此信号管理即可。
include <signal.h>
int nproc = 10;
int listaPID[10];
int forkValue;
int main (void){
signal(SIGTERM,signalHandler);
//...
createSM();
for(int i=0; i<nproc; i++){
forkValue = fork();
if(forkValue == 0)
break;
listaPid[i] = forkValue;
}
if (forkValue==0){
//child's tasks
removeSM();
exit(0);
}
//parent's tasks
deleteSM();
exit(0);
}
void signalHandler(int sig){
//if parent, kill all of its childs + remove and delete shared memory + exit
if (forkValue>0){
for(int i=0;i<nproc;i++)
kill((listaPid[i]),SIGTERM);
deleteSM();
exit(0);
}
//if son, remove shared memory + exit
else {
removeSM();
exit(0);
}
}
答案 0 :(得分:1)
^C
会生成一个SIGINTR
,因此您还必须为该信号安装处理程序。除了SIGQUIT
之外,您可能还想为^]
(SIGHUP
中断键)和SIGTERM
(会话结束)安装allso信号处理程序。
从我的角度来看,如果要杀死一个组中的所有进程,最好在父进程上创建一个进程组(setpgrp(0,0);
,请参见setpgrp(2)
),然后终止进程组(对于kill(2)
的进程组,您使用组更改符号kill(SIGTERM, -getpgrp());
的ID,(请参见kill(2)
和setpgrp(2)
的联机帮助页)