間隔定時器itimer

2021-08-28 13:37:38 字數 1556 閱讀 9161

間隔定時器的介面如下:

#include int getitimer(int which, struct itimerval *curr_value);

int setitimer(int which, const struct itimerval *new_value,

struct itimerval *old_value);

結構定義:

struct itimerval ;

struct timeval ;

可以通過呼叫上面兩個api介面來設定和獲取間隔定時器資訊。系統為每個程序提供了3種itimer,每種定時器在不同時間域遞減,當定時器超時,就會向程序傳送乙個訊號,並且重置定時器。3種定時器的型別,如下表所示:

取值含義

訊號傳送

itimer_real

定時真實時間,與alarm型別相同。

sigalrm

itimer_virt

定時程序在使用者態下的實際執行時間。

sigvtalrm

itimer_prof

定時程序在使用者態和核心態下的實際執行時間。

sigprof

表1 引數which與定時器型別

在linux 2.6.16 之前,itimer的實現是基於核心定時器timer wheel封裝成的定時器介面。核心封裝的定時器介面是提供給其他核心模組使用,也是其他定時器的基礎。itimer通過核心定時器的封裝,生成提供給使用者層使用的介面setitimer和getitimer。核心定時器timer wheel提供的核心態呼叫介面為:可參考

add_timer()

del_timer()

init_timer()

在linux 2.6.16 以來,itimer不再採用基於timer wheel的核心定時器進行實現。而是換成了高精度的核心定時器hrtimer進行實現。具體實現可參考:

如果定時器超時時,程序是處於執行狀態,那麼超時的訊號會被立刻傳送給該程序,否則訊號會被延遲傳送,延遲時間要根據系統的負載情況。所以這裡有乙個bug:當系統負載很重的情況下,對於itimer_real定時器有可能在上一次超時訊號傳遞完成前再次超時,這樣就會導致第二次超時的訊號丟失

每個程序中同一種定時器只能使用一次。

該系統呼叫在posix.1-2001中定義了,但在posix.1-2008中已被廢棄。所以建議使用posix定時器api(timer_gettime, timer_settime)代替。

函式alarm本質上設定的是低精確、非過載的itimer_real類定時器,它只能精確到秒,並且每次設定只能產生一次定時。函式setitimer 設定的定時器則不同,它們不但可以計時到微妙(理論上),還能自動迴圈定時。在乙個unix程序中,不能同時使用alarm和itimer_real類定時器。

下面是測試**:

#include #include #include #include void sig_handler(int signo)

定時器之基於模模式的間隔定時

1 include iocc2530.h 2 3 define d3 p1 0 4 define d4 p1 1 5 define d5 p1 3 6 define d6 p1 4 78 unsigned char count 0 長定時累計變數910 埠初始化函式 11 void init por...

Linux間隔定時器的使用 探索一

2011年1月17日 之前看 高階unix程式設計 說有基本定時器與高階定時器之分 好像基本定時器不符合我的要求,那麼就先來個高階的吧。寫個 看看會有什麼發生 2011年1月18日 看下timer create函式 int t1 timer t tm id timer t其實是個long型 t1 t...

定時器設計的時間間隔準確嗎?

有一好友今天在群裡突然發問?定時器 setinterval 裡面的 如果執行的時間大於定時器設計的時間,會怎樣呢?我不由的深思起來。間隔首先要明確什麼是間隔?假如有兩輛汽車a b,兩輛車的間隔是多少呢,當然是a的尾部與b的頭部的距離了。function test void 1000 function...