Как заставить обработчик сигнала запускать его только один раз и завершать все процессы? - PullRequest
0 голосов
/ 09 мая 2018

У меня N дочерний процесс и родительский процесс. У меня есть обработчик сигнала, который в коде ниже.

void unlink_semaphores(){

sem_unlink(SEM_NAME1) < 0;
   // perror("sem_unlink(3) failed");

sem_unlink(SEM_NAME2) < 0;
    //perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME3) < 0;
   // perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME4) < 0;
   // perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME5) < 0;
    //perror("sem_unlink(3) failed");
sem_unlink(SEM_NAME6) < 0;
    //perror("sem_unlink(3) failed");

sem_unlink(SEM_NAME7) < 0;
    //perror("sem_unlink(3) failed");
if (shm_unlink(SHMOBJ_PATH1) != 0) {
   // perror("In shm_unlink() of buffer 1");
    exit(1);
}
}
void sinyal_handler(int signo)

{

if (signo == SIGINT || signo == SIGTERM) {
    if(signo == SIGINT) printf("received Ctrl+C\n");
    if(signo == SIGTERM) printf("received SIGTERM \n");

    printf("closing semaphores and giving shared maps...\n");
    unlink_semaphores();
    _exit(EXIT_FAILURE);
}

}

в основной программе перед установкой я установил обработчики сигналов.

signal(SIGINT,&sinyal_handler);
signal(SIGTERM,&sinyal_handler);

и дочерние процессы никогда не выходят за пределы цикла While (1), пока CTRL + C не придет в программу и обработчик сигнала не убьет его с закрытием связанных семафоров и т. Д.

for (i = 0; i < PROCESS_N; i++) {
        if (fork() == 0) {
            // do the job specific to the child process
            //random shared variable -> ra

            while(1){ .. code->

Проблема в том, что когда я нажимаю CTRL + C, программа вызывает обработчики сигналов несколько раз и печатает информацию, пытаюсь отсоединить файлы несколько раз.

Как это исправить?

1 Ответ

0 голосов
/ 09 мая 2018

Когда вы разветвляете новый процесс, то вновь разветвленный дочерний объект наследует обработчики сигналов родительского процесса. Таким образом, в вашем случае и родительский, и дочерний процессы будут иметь одинаковые обработчики сигналов, и когда сигнал будет получен, они оба запустятся.

Чтобы исправить это, вы можете зарегистрировать обработчики сигналов после fork, только в родительском процессе, или заблокировать сигналы в дочернем процессе с помощью sigprocmask

...