Как повторить SIGALRM? - PullRequest
       21

Как повторить SIGALRM?

2 голосов
/ 12 января 2012

Я хочу повторно настроить SIGALRM и подождать, пока он не погаснет, а затем сделать это снова.В моей функции-обработчике у меня есть:

void handler(int signum)
{
    struct itimerval timer;
    struct sigaction sa; 

    sa.sa_handler = handler;

    timer.it_interval.tv_sec = 0;
    timer.it_interval.tv_usec = 0;
    timer.it_value.tv_usec = 0;
    timer.it_value.tv_sec = 1000;

    sigaction(SIGALRM, &sa, 0);
    setitimer(ITIMER_REAL, &timer, 0);

    printf("pause for me\n");
    pause();
}

, а в основной -:

int main(void)
{
    handler(0);
    return 0;
}

Однако все, что он делает, это повторяет дважды, затем останавливается.Я хочу, чтобы это продолжало повторяться.В чем проблема?

1 Ответ

4 голосов
/ 12 января 2012

struct sigaction имеет несколько полей, которые вы не инициализируете. Мусорный стек, который вы получили первые несколько раз, работает, а затем вы сталкиваетесь с ситуацией, когда это не так, и ваш обработчик не установлен. Вы должны проверить возврат sigaction(). Когда вы получите -1, напечатайте сообщение, включающее errno.

Вы должны позвонить sigaction() один раз (с main() или аналогичным). Он будет «прилипать», если вы не установите флаг SA_RESETHAND. Тогда ваш другой существующий код, вероятно, будет работать.

Для более точного повторения времени вы должны воспользоваться struct itimerval it_interval, который позволяет вам установить значение таймера next , чтобы оно началось сразу после срабатывания текущего.

...