如何重复SIGALRM?

时间:2012-01-12 00:27:35

标签: c timer signals

我想重复设置一个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 个答案:

答案 0 :(得分:4)

struct sigaction有几个你没有初始化的字段。你碰巧在前几次获得的堆栈垃圾工作,然后你遇到它没有的情况,你的处理程序没有安装。您应该测试sigaction()返回。当您-1打印包含errno

的邮件时

您应该拨打sigaction()一次(来自main()或类似)。如果你没有设置SA_RESETHAND标志,它将“坚持”。那么你的其他现有代码可能会有效。

为了更准确地重复计时,您应该利用struct itimerval的{​​{1}}来设置 next 计时器值,以便在当前计时器触发时立即开始