[英]How to repeat 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;
}
但是,它所做的只是重复两次然后停顿。 我希望它继续重复。 有什么问题?
struct sigaction
有几个尚未初始化的字段。 您刚开始遇到的堆栈垃圾会起作用,然后您遇到了这样的情况,即堆栈垃圾没有安装并且未安装处理程序。 您应该测试sigaction()
返回。 当您得到-1
打印一条包含errno
的消息。
您应该一次调用sigaction()
(通过main()
或类似方法)。 如果未设置SA_RESETHAND
标志,它将“粘住”。 然后您的其他现有代码可能会起作用。
为了更精确地重复计时,您应该利用struct itimerval
的it_interval
来设置下一个计时器值,这样它将在当前计时器触发时立即开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.