#include<stdio.h>
#include<signal.h>
void handler(int signo)
{
printf("Into handler\n");
while(1);
}
int main()
{
struct sigaction act;
act.sa_handler = handler;
act.sa_flags = 0;
sigemptyset(& act.sa_mask);
sigaction(SIGINT, &act, NULL);
while(1);
return 0;
}
После ловли KeyboardInterrupt однажды, когда я нажимаю "Ctrl+C" снова, не обрабатывается SIGINT... Я предназначаю, чтобы "В обработчик" был распечатан каждый раз, когда я нажимаю "Ctrl+C".
Я хочу поймать SIGINT в "обработчике SIGINT ()" самом..
Вам нужно установить SA_NODEFER для sa_mask, чтобы поймать тот же сигнал, что и тот, который вы обрабатываете в настоящее время:
SA_NODEFER: Не препятствовать получению сигнала из собственного обработчика сигналов. SA_NOMASK - устаревший нестандартный синоним этого флага.
То, что вы делаете, кажется очень плохой идеей, и может быть лучше просто установить флаг в обработчике и вернуться из него, и затем сделайте печать из main.
Вам необходимо установить SA_NODEFER
или иным образом повторно включить сигнал в самом обработчике сигнала, потому что в противном случае сигнал будет заблокирован или переключен обратно к своему поведению по умолчанию прямо перед вызовом обработчика.
Вызов printf
из обработчика сигнала является неопределенным поведением. Это может привести к сбою вашей программы. Список функций, которые вы действительно можете безопасно вызывать из обработчика сигналов, очень ограничен. Мне нужен список асинхронно-сигнальных функций из glibc
Использование функции printf
в обработчике сигнала - не совсем хорошая идея, так как она может вызвать поведение, которое не определено! В примере кода отсутствует важный бит для работы обработчика сигнала.... Посмотрите мой блог об этом здесь на 'Q6. How to trap a Segmentation fault?'
Также вам нужно заменить цикл while
на что-то более надежное в качестве способа завершить программу во время тестирования обработчика сигналов... например... как вы его завершаете?
Обработчик "while (1)" предотвращает возврат первого вызова службы. Удаление этого и последующих прерываний должно вызвать повторный вызов обработчика.
Процедура обслуживания прерывания не должна препятствовать возврату вызывающего потока.