Linux應用層中的setitimer的使用說明

Linux應用層中的setitimer的使用說明

    使用時需要引入的頭文件:    

#include <sys/time.h> 
    setitimer函數原型:    
int setitimer(int which, const struct itimerval *new_value,  
            struct itimerval *old_value);
    其中which參數表示類型,可選的值有:
        ITIMER_REAL:      以系統真實的時間來計算,它送出SIGALRM信號。
        ITIMER_VIRTUAL:以該進程在用戶態下花費的時間來計算,它送出SIGVTALRM信號。
        ITIMER_PROF:     以該進程在用戶態下和內核態下所費的時間來計算,它送出SIGPROF信號。
    緊接着的new_value和old_value均爲itimerval結構體,先看一下itimerval結構體定義:    
struct itimerval {  
    struct timeval it_interval; /* next value */  
    struct timeval it_value;    /* current value */  
};  
  
struct timeval {  
    time_t      tv_sec;         /* seconds */  
    suseconds_t tv_usec;        /* microseconds */  
};  
    itimeval又是由兩個timeval結構體組成,timeval包含tv_sec和tv_usec兩部分,其中tv_se爲秒,tv_usec爲微秒(即1/1000000秒)
其中的new_value參數用來對計時器進行設置,it_interval爲計時間隔,it_value爲延時時長。

    settimer工作機制是,先對it_value倒計時,當it_value爲零時觸發信號,然後重置爲it_interval,繼續對it_value倒計時,一直這樣循環下去。 
    基於此機制,setitimer既可以用來延時執行,也可定時執行。

    注意:假如it_value爲0是不會觸發信號的,所以要能觸發信號,it_value得大於0;如果it_interval爲零,只會延時,不會定時(也就是說只會觸發一次信號)。
    old_value參數,通常用不上,設置爲NULL,它是用來存儲上一次setitimer調用時設置的new_value值。

    下面例子中表示的是在setitimer方法調用成功後,延時1微秒便觸發一次SIGALRM信號,以後每隔1秒觸發一次SIGALRM信號。    

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


void signalHandler(int signo)
{
    switch (signo) {
    case SIGALRM:    //定時信號(由系統定時事件觸發)
        printf("Caught the SIGALRM signal!\n");
        break;
    case SIGINT:     //終端按下CTRL + C鍵觸發
        printf("Caught the SIGINT signal!\n");
        exit(0);
        break;
    }
}

int main(int argc, char *argv[])
{
    /* 安裝信號處理函數 */
    signal(SIGALRM, signalHandler);
    signal(SIGINT,  signalHandler);
    
    struct itimerval new_value, old_value;
    new_value.it_value.tv_sec  = 0;
    new_value.it_value.tv_usec = 1;

    new_value.it_interval.tv_sec  = 1;
    new_value.it_interval.tv_usec = 0;

    setitimer(ITIMER_REAL, &new_value, &old_value);

    while (1) {
    }

    return 0;
}   

    此外,在應用過程中還需要注意:

 setitimer一個進程中只能有一個 下一個會覆蓋前一個的定時 想一個進程多個定時器只能自己實現。
 setitimer() 不支持在同一進程中同時使用多次以支持多個定時器。

 linux有關定時器(setitimer)的敘述是這樣的:  
  linux系統給每個進程提供了3個定時器,每個定時器在各自不同的域裏面計數。當任何一個timer計數到結束了,系統就發送一個信號(signal)給該進程,同時計數器重置。  
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章