2016-01-20 114 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)。 –