Linux應用層定時器

2021-09-17 22:25:03 字數 1940 閱讀 6444

alarm會設定乙個定時器,當時間到期後會觸發sigalrm訊號,該訊號可能會打斷系統呼叫的執行,它使用的定時器和setitimer對應的itimer_real是同乙個。

#include #include #include #include #include #include #include #include "include/debug.h"

void sig_func(int signo)

int set_signal(int signo, void func(int signo))

return 0;

}int main()

執行結果:

$ ./timer_test 

[6858] info: block read

[6858] info: sigalrm received!

[6858] info: read returns

alarm會打斷阻塞的系統呼叫,因此使用時要注意處理errno。

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

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

struct itimerval *old_value);

setitimer根據引數的不同可能會產生三種不同的訊號:

itimer_real    到期產生sigalrm訊號

itimer_virtual 到期產生si**talrm訊號

itimer_prof 到期產生sigprof訊號

既然會產生訊號,同樣不可避免的會打斷阻塞的系統呼叫。

當setitimer設定引數itimer_real時產生的是sigalrm訊號,並且使用的定時器也屬於同乙個,因此如果和alarm共用可能會產生意象不到的結果,因此要慎重。

setitimer限定每個程序只能設定乙個定時器,對於多個定時任務,只能自己實現乙個timer鍊錶去處理,對於需要多個定時任務的程序不太友好。

posix timer api允許乙個程序可以建立很多個定時器任務,這是它的一大優勢:

timer_create: 建立了乙個定時器。

timer_settime: 啟動或者停止乙個定時器。

timer_gettime: 返回到下一次到期的剩餘時間值。

timer_getoverrun: 返回上次定時器到期時超限值。

timer_delete: 停止並刪除乙個定時器。

timer的觸發方式也比較靈活,可以選擇上報signal,也可以選擇執行乙個thread function,具體參見man手冊。clockid為:

clock_realtime

clock_monotonic

clock_process_cputime_id

clock_thread_cputime_id

上面介紹的timer都是跟隨系統tick進行計算時間的,當系統處於休眠狀態時,這些tick都會停掉,因此定時器也會失效,此時如果想要定時器繼續工作,就必須使用alarm timer。

linux系統中有兩個時鐘可以在系統休眠時繼續執行,realtime alarm和boottime alarm。alarm timer借助rtc裝置,一直供電且具備喚醒功能,在系統進入suspend過程中,將最近一次超時時間寫入rtc裝置,超時後會喚醒系統執行timer超時函式。

想要使用這兩個alarm timer,依然可以使用posix timer api。

對應的clockid為:

clock_realtime_alarm

clock_boottime_alarm

應用層定時器 timerfd

sys timerfd.hint timerfd create int clockid,int flags clock realtime systemwide realtime clock.實時時鐘,真實的時間 clock monotonic 系統啟動後開始計時,從不進行調整和復位,不受系統時鐘修改...

linux應用層定時器與休眠

1 alarm 如果不要求很精確的話,用alarm 和signal 就夠了 unsigned int alarm unsigned int seconds 函式說明 alarm 用來設定訊號sigalrm在經過引數seconds指定的秒數後傳送給目前的程序。如果引數seconds為0,則之前設定的鬧...

Linux應用層下定時器函式setitimer

1.介紹 在linux下如果定時如果要求不太精確的話,使用alarm 和signal 就行了 精確到秒 但是如果想要實現精度較高的定時功能的話,就要使用setitimer函式。setitimer 為linux的api,並非c語言的standard library,setitimer 有兩個功能,一是...