繁体   English   中英

如何重复SIGALRM?

[英]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 itimervalit_interval来设置下一个计时器值,这样它将在当前计时器触发时立即开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM