Остановка тревоги при поступлении сигнала

Я пытаюсь совместить сигнал и тревогу. У меня есть 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 функция.
Другие вопросы по тегам