2016-01-20 121 views
1

我想每秒触发一个计时器30秒。但是,定时器只触发一次,程序停止。如何让计时器运行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();  
} 

回答

0

在收到一个信号后,你的程序会被取消暂停,它会到main()的结尾并返回。你需要再次暂停,你想等待另一个信号。

0

您遇到的一个问题是第一个定时器触发器结束了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; 
} 

一个要注意的最后一件事是,有没有保证,如果系统负载较高的定时器将被传递每一秒。

+0

也使用'sigaction'代替'signal'(旧API)。 –