linux 開發 定時器使用setitimer

2021-06-19 04:49:24 字數 1502 閱讀 1708

linux 為每乙個程序提供了 3 個 setitimer 間隔計時器:

所謂 real 時間,即我們人類自然感受的時間,英文計算機文件中也經常使用 wall-clock 這個術語。說白了就是我們通常所說的時間,比如現在是下午 5 點 10 分,那麼一分鐘的 real 時間之後就是下午 5 點 11 分。

virtual 時間是程序執行的時間,linux 是乙個多使用者多工系統,在過去的 1 分鐘內,指定程序實際在 cpu 上的執行時間往往並沒有 1 分鐘,因為其他程序會被 linux 排程執行,在那些時間內,雖然自然時間在流逝,但指定程序並沒有真正的執行。virtual 時間就是指定進**正的有效執行時間。比如 5 點 10 分開始的 1 分鐘內,程序 p1 被 linux 排程並占用 cpu 的執行時間為 30 秒,那麼 virtual 時間對於程序 p1 來講就是 30 秒。此時自然時間已經到了 5 點 11 分,但從程序 p1 的眼中看來,時間只過了 30 秒。

prof 時間比較獨特,對程序 p1 來說從 5 點 10 分開始的 1 分鐘內,雖然自己的執行時間為 30 秒,但實際上還有 10 秒鐘核心是在執行 p1 發起的系統呼叫,那麼這 10 秒鐘也被加入到 prof 時間。這種時間定義主要用於全面衡量程序的效能,因為在統計程式效能的時候,10 秒的系統呼叫時間也應該算到 p1 的頭上。這也許就是 prof 這個名字的來歷吧。

使用 setitimer timer 需要了解下面這些介面 api:

int getitimer(int which,struct itimerval *value); 

int setitimer(int which,struct itimerval *newval,

struct itimerval *oldval);

itimerval 的定義如下:

struct itimerval

getitimer 函式得到間隔計時器的時間值,儲存在 value 中。

setitimer 函式設定間隔計時器的時間值為 newval. 並將舊值儲存在 oldval 中;which 表示使用三個計時器中的哪乙個。

itimerval 結構中的 it_value 是第一次呼叫後觸發定時器的時間,當這個值遞減為 0 時,系統會向程序發出相應的訊號。此後將以 it_internval 為週期定時觸發定時器。

給出乙個具體的例子:

清單 9,setitmer 例子

void print_info(int signo) 

void init_sigaction(void)

void init_time()

int main()

這個程式使用 prof 時間,每經過兩秒 prof 時間之後就會列印一下timer fired字串。

需要指出:setitimer 計時器的精度為 ms,即 1000 分之 1 秒,足以滿足絕大多數應用程式的需要。但多**等應用可能需要更高精度的定時,那麼就需要考慮使用下一類定時器:posix timer。

Linux下定時器使用

linux下的定時器有兩種,以下分別介紹 1 alarm 如果不要求很精確的話,用 alarm 和 signal 就夠了 unsigned int alarm unsigned int seconds 專門為sigalrm訊號而設,在指定的時間seconds秒後,將向程序本身傳送sigalrm訊號,...

Linux下定時器使用

linux下的定時器有兩種,以下分別介紹 1 alarm 如果不要求很精確的話,用 alarm 和 signal 就夠了 unsigned int alarm unsigned int seconds 專門為sigalrm訊號而設,在指定的時間seconds秒後,將向程序本身傳送sigalrm訊號,...

定時器使用

dword winapi checksendinfovector lpvoid lpparameter return 0 void callback dotimer hwnd hwnd,uint umsg,uint ptr idevent,dword dwtime timerproc的引數hwnd是...