Почему мой обработчик сигнала не работает?
Я хочу обработать сигнал 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. Я иногда путаюсь.