2012-01-12 62 views
2

我想重复建立一个SIGALRM并等到它熄灭,然后重新执行。在我的处理函数中我有:如何重复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; 
} 

然而,它是所有重复两次,然后摊位。我希望它继续重复。有什么问题?

+0

从信号处理程序中使用'setitimer'是否安全?但是,在这里可能是好的。 – 2012-01-12 01:52:50

+0

但'timer_settime()'是[ok](http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html)。 – 2012-01-12 01:56:00

回答

4

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

您应该致电sigaction()一次(从main()或类似的)。如果你不设置SA_RESETHAND标志,它会“粘住”。那么你的其他现有代码可能会工作。

对于你应该利用struct itimervalit_interval其允许设置定时器值,因此它会立即开始的当前一个的火灾时,更精确的重复定时。