使用更多进程在C中捕获SIGTERM

时间:2019-06-23 13:23:54

标签: c signals fork sigterm

我需要我的程序通过捕获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);
    }
}

1 个答案:

答案 0 :(得分:1)

^C会生成一个SIGINTR,因此您还必须为该信号安装处理程序。除了SIGQUIT之外,您可能还想为^]SIGHUP中断键)和SIGTERM(会话结束)安装allso信号处理程序。

从我的角度来看,如果要杀死一个组中的所有进程,最好在父进程上创建一个进程组(setpgrp(0,0);,请参见setpgrp(2)),然后终止进程组(对于kill(2)的进程组,您使用组更改符号kill(SIGTERM, -getpgrp());的ID,(请参见kill(2)setpgrp(2)的联机帮助页)