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 有兩個功能,一是...