Поймать SIGTERM в C с большим количеством процессов - PullRequest
1 голос
/ 23 июня 2019

Мне нужно, чтобы моя программа правильно завершила все свои процессы, перехватывая сигнал 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 Ответ

1 голос
/ 25 июня 2019

^C генерирует SIGINTR, поэтому вам необходимо установить обработчики и для этого сигнала. Возможно, вы захотите установить allso обработчики сигналов для SIGQUIT (^] ключ прерывания) и SIGHUP (конец сеанса) в дополнение к SIGTERM.

С моей точки зрения, если вы собираетесь уничтожить все процессы в группе, лучше всего создать группу процессов в родительском процессе (setpgrp(0,0);, см. setpgrp(2)), а затем убить группу процессов. (для kill(2) группы процессов, в которой вы используете идентификатор знака изменения группы, kill(SIGTERM, -getpgrp());, (см. справочные страницы для kill(2) и setpgrp(2))

...