Ловля сигнала в его собственном обработчике

#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 ()" самом..

11
задан Abhijeet Rastogi 10 March 2010 в 20:04
поделиться

4 ответа

Вам нужно установить SA_NODEFER для sa_mask, чтобы поймать тот же сигнал, что и тот, который вы обрабатываете в настоящее время:

SA_NODEFER: Не препятствовать получению сигнала из собственного обработчика сигналов. SA_NOMASK - устаревший нестандартный синоним этого флага.

10
ответ дан 3 December 2019 в 05:12
поделиться

То, что вы делаете, кажется очень плохой идеей, и может быть лучше просто установить флаг в обработчике и вернуться из него, и затем сделайте печать из main.

Вам необходимо установить SA_NODEFER или иным образом повторно включить сигнал в самом обработчике сигнала, потому что в противном случае сигнал будет заблокирован или переключен обратно к своему поведению по умолчанию прямо перед вызовом обработчика.

Вызов printf из обработчика сигнала является неопределенным поведением. Это может привести к сбою вашей программы. Список функций, которые вы действительно можете безопасно вызывать из обработчика сигналов, очень ограничен. Мне нужен список асинхронно-сигнальных функций из glibc

6
ответ дан 3 December 2019 в 05:12
поделиться

Использование функции printf в обработчике сигнала - не совсем хорошая идея, так как она может вызвать поведение, которое не определено! В примере кода отсутствует важный бит для работы обработчика сигнала.... Посмотрите мой блог об этом здесь на 'Q6. How to trap a Segmentation fault?'

Также вам нужно заменить цикл while на что-то более надежное в качестве способа завершить программу во время тестирования обработчика сигналов... например... как вы его завершаете?

3
ответ дан 3 December 2019 в 05:12
поделиться

Обработчик "while (1)" предотвращает возврат первого вызова службы. Удаление этого и последующих прерываний должно вызвать повторный вызов обработчика.

Процедура обслуживания прерывания не должна препятствовать возврату вызывающего потока.

1
ответ дан 3 December 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: