1

我想每秒触发一个计时器,持续 30 秒。但是,定时器只触发一次,程序停止。如何让计时器运行 30 秒?

#include <sys/time.h>
#include <signal.h>

void alarmhandler(){
    printf("\nTimer triggered");
}

void main(){
    struct itimerval timerval;
    signal(SIGALRM, alarmhandler);
    timerval.it_value.tv_sec = 1;
    timerval.it_value.tv_usec = 0;
    timerval.it_interval.tv_sec = 30;
    timerval.it_interval.tv_usec = 0;
    setitimer(ITIMER_REAL, &timerval, 0);
    pause();    
}
4

2 回答 2

0

收到信号后,您的程序将取消暂停,它只是进入 main() 的末尾并返回。你需要再次暂停它,你想等待另一个信号。

于 2016-01-20T04:49:07.097 回答
0

您遇到的一个问题是第一个计时器触发器结束pause呼叫并且您的程序终止。该pause命令描述如下:

pause 函数暂停程序执行,直到信号到达,该信号的作用是执行处理函数或终止进程。

另一个问题是您错误地使用了“间隔”。如果它是一个重复计时器,该值应该是计时器重置为的数字。因此,要每秒触发一次,您需要将其设置为1.

现在,如果您希望它运行 30 秒,您需要维护一个计数器,然后在该计数器完成后重置计时器。最后,您需要继续重新暂停,直到处理了足够的中断。

尝试这个:

#include <sys/time.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

volatile int timer_remain = 30;

void alarmhandler()
{
    static struct itimerval notimer = { 0 };
    printf( "Timer triggered\n" );
    if( --timer_remain == 0 )
    {
        setitimer( ITIMER_REAL, &notimer, 0 );
    }
}

int main()
{
    struct itimerval timerval = { 0 };
    timerval.it_value.tv_sec = 1;
    timerval.it_interval.tv_sec = 1;

    signal( SIGALRM, alarmhandler );
    setitimer( ITIMER_REAL, &timerval, 0 );

    while( timer_remain > 0 )
    {
        pause();
    }

    printf( "Done\n" );
    return 0;
}

最后要注意的一件事是,如果系统负载很高,则无法保证每秒都会发送计时器。

于 2016-01-20T04:52:12.700 回答