Проблема с тревогой () и SIGALRM в C - PullRequest
0 голосов
/ 08 февраля 2011

У меня проблема с SIGALRM, которая, похоже, не сработала.Я использую signal (), а не sigaction () для простоты кода.

Цель состоит в том, чтобы иметь некоторый цикл, который читает, но через x секунд повторно инициализирует все переменные перед повторным чтением.Я использую для этого тревогу.

volatile sig_atomic_t restartBool;

void    catch_alarm(int sig)
{
    fprintf(stderr, "ALARM CALLED\n");
    restartBool = 1;
}

int     main(void)
{

     int n, fd_in = 0;
     char newChar;

    signal(SIGALRM, catch_alarm);

    while (1) {                     /* main loop */

            restartBool = 0;

            // Set a timer before we start reading
            alarm(2);

            while (restartBool == 0 && (n = read(fd_in, &newChar, 1)) == 1) {       /* parse input */
                /* ..... */
            }
            fprintf(stderr, "EXITED THE LOOP");

            // Cancel the alarm/timer
            alarm(0);
    }
}

Хорошо, оператор fprintf () в функции catch_alarm () никогда не вызывается, и я не уверен почему (я использую Linux).1007 * Любая помощь будет великолепна,

Большое спасибо,

Джари

1 Ответ

1 голос
/ 08 февраля 2011

Скорее всего, ваше чтение возвращает 0 (байтов не осталось) задолго до того, как ваш таймер выключится. То есть цикл завершается, потому что у вас нет данных, а затем вы отменяете сигнал тревоги (который еще не сработал).

...