Остановка тревоги при поступлении сигнала
Я пытаюсь совместить сигнал и тревогу. У меня есть 2 процесса. 1 получает входные данные от пользователя и записывает их в канал, а затем отправляет сигнал (SIGUSR2) другому процессу. В другом процессе у меня есть бесконечный цикл, который выдает сигнал тревоги каждую секунду. Поэтому моя программа должна обрабатывать как сигналы тревоги, так и сигналы SIGUSR2. Дескриптор тревоги работает нормально, но когда сигнал поступает и обработчик сигнала активен, кажется, что он не возвращается в цикл, который генерирует тревогу. Я прочитал справочную страницу о тревоге и сигнале и ничего не нашел. Он говорит, что функция обработчика сигнала должна вернуться к исходному коду, но это не так. Мне нравится знать, почему код не возвращается в цикл после обработчика сигнала, и как заставить его выполнять функцию обработчика аварийных сигналов каждую секунду, даже если сигнал получен между тем.
это цикл:
while (1) {
signal (SIGUSR2 , signal_hand);
signal (SIGALRM , alarm_hand);
alarm (1);
pause();
}
Это функция обработчика сигнала:
void signal_hand (int sig) {
// reading from the pipe and doing things accordingly
...
}
И это функция обработчика тревоги:
void alarm_hand (int sig) {
// doing things
...
}
1 ответ
Каждый раз, когда вы получаете SIGUSR2
(или любой другой сигнал), вы повторяете while
петля, и это сбрасывает таймер будильника на 1 секунду. Это означает, что если SIGUSR2
сигналы приходят чаще, чем раз в секунду, ваш будильник никогда не гаснет.
Попробуйте внести следующие изменения:
- Переместить два
signal()
настроить ваши обработчики тревоги вне цикла. Нет необходимости сбрасывать обработчики сигналов каждый раз через цикл. Как только они установлены, они установлены. - Не звони
alarm(1)
в цикле послеSIGALRM
возможно, не был получен. Вместо этого позвонитеalarm(1)
один раз, прежде чем начать цикл, и еще раз, чтобы сбросить таймер изнутриalarm_hand
функция.