Linux應用層的定時器Timer

工程師WWW發表於2013-11-06
 在linux下提供了兩種基本的Timer機制:alarm和settimer
    1、alarm
       #include <unistd.h>
       unsigned int alarm(unsigned int seconds);
       這是個最簡單的Timer,當呼叫了alarm(n)時,等待n秒後,就會觸發一次SIGALRM訊號,故需要在呼叫alarm函式前先設定好SIGALRM訊號對應的處理函式才行,而當呼叫alarm(0)時,表示停止當前的timer處理,不要發出SIGALRM訊號。
       返回值:返回上一次呼叫alarm函式的剩餘秒好,若之前沒有呼叫alarm函式,則返回0。
       例(第一次等待1秒觸發Timer,之後都是2秒觸發):
       #include <iostream>
       #include <unistd.h>
       #include <signal.h>

       using namespace std;

       void my_alarm_handler(int a){
             cerr<<"my_alarm_handler"<<endl;
             alarm(2);//更改為2秒呼叫一次Timer
       }

       int main(){
             signal(SIGALRM, my_alarm_handler);
             alarm(1);

             while(1){}

             return 0;
        }

    2、settimer
       #include <sys/time.h>
       #define ITIMER_REAL 0
       #define ITIMER_VIRTUAL 1
       #define ITIMER_PROF 2

       int getitimer(int which, struct itimerval *value);
       int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue);
       settimer和gettimer函式都提供了三種類別的Timer供使用:
       1)、ITIMER_REAL:以系統實際的時間來計算,觸發時會發出SIGALRM訊號。
       2)、ITIMER_VIRTUAL:只計算程式的執行時間(在使用者態),觸發時會發出SIGVTALRM訊號。
       3)、ITIMER_PROF:計算程式在使用者態和核心態的處理時間,觸發時會發出SIGPROF訊號。
       通過第一個引數which來指定要使用哪一種Timer(ITIMER_REAL、ITIMER_VIRTUAL、ITIMER_PROF)。settimer函式是用來設定對應的Timer的觸發時間是多少,而gettimer函式是用來獲取上一次Timer設定的時間。設定的時間是一個結構體struct itimerval:
       struct itimerval {
        struct timeval it_interval; 
        struct timeval it_value; 
       };
       struct timeval {
        long tv_sec; 
        long tv_usec; 
       };
       settimer由第二個引數value設定觸發時間,第三個引數ovalue用來獲取上一次settimer設定的itimerval值(該引數可以設定為NULL)。對於itimerval裡面變數的值,當我們設定it_interval的值為0時,Timer只會觸發一次,而it_value設定為0時則表示Timer結束。
       返回值:0為成功,-1為失敗。
       例(第一次等待1秒觸發Timer,之後都是2秒觸發):
       #include <iostream>
       #include <sys/time.h>
       #include <signal.h>

       using namespace std;

       void my_alarm_handler(int a){
           cerr<<"test "<<endl;
       }

       int main(){
           struct itimerval t;
           t.it_interval.tv_usec = 0;
           t.it_interval.tv_sec = 2;
           t.it_value.tv_usec = 0;
           t.it_value.tv_sec = 1;

           if( setitimer( ITIMER_REAL, &t, NULL) < 0 ){
               cerr<<"settimer error."<<endl;
               return -1;
           }
           signal( SIGALRM, my_alarm_handler );

           while(1){
               sleep(2);
           }
           return 0;
       }
       通過上面的例子,我們可以知道對於linux內建Timer只能同一時間處理3個Timer,如果需要多個的話,那麼這就是個問題了。不過我們可以通過sleep函式或time函式來結合使用實現定時功能,具體可以參考:http://hi.baidu.com/adrain001/blog/item/60580bc40871d6a18226ace4.html
       參考網址:

相關文章