Почему мой обработчик сигнала не работает?

Я хочу обработать сигнал SIGTSTP (18) в Linux. Это мой код:

void handler(int signum){
    printf("Signal %d has tried to stop me.", signum);
}

int main(void){
    struct sigaction act;
    sigset_t mask;

    act.sa_handler = handler;
    act.sa_flags = 0;

    sigemptyset(&mask);
    sigaddset(&mask, SIGTSTP);
    sigprocmask(SIG_SETMASK, &mask, NULL);

    sigaction(SIGTSTP, &act, NULL);

    pause();

}

Когда я отправляю сигнал с другого терминала следующим образом:

$ kill -18 PID

функция handler() не запускается. Я попытался заменить SIGTSTP на 18 в вызове sigaction(). Это не работает.

Есть идеи? Спасибо за ваше время.

2 ответа

Решение

Вы сознательно блокируете доставку SIGTSTP к вашему процессу, делая

sigaddset(&mask, SIGTSTP);
sigprocmask(SIG_SETMASK, &mask, NULL);

sigprocmask с SIG_SETMASK устанавливает маску для блокировки сигналов. Удалить звонок sigprocmaskи сигнал должен быть доставлен.

Еще одна вещь, которую нужно сделать, это обнулить act перед заполнением:

memset(&act, 0, sizeof(act));

Наиболее вероятная причина в том, что вы не установили свой struct sigaction act в ноль. Он будет полон случайных значений стека.

Исправьте это с помощью struct sigaction act = {}; или же memset(&act, 0, sizeof(act))

Дважды проверьте, что я правильно понял порядок аргументов memset. Я иногда путаюсь.

Другие вопросы по тегам