我想重复设置一个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 :(得分:4)
struct sigaction
有几个你没有初始化的字段。你碰巧在前几次获得的堆栈垃圾工作,然后你遇到它没有的情况,你的处理程序没有安装。您应该测试sigaction()
返回。当您-1
打印包含errno
。
您应该拨打sigaction()
一次(来自main()
或类似)。如果你没有设置SA_RESETHAND
标志,它将“坚持”。那么你的其他现有代码可能会有效。
为了更准确地重复计时,您应该利用struct itimerval
的{{1}}来设置 next 计时器值,以便在当前计时器触发时立即开始