1.介紹
在linux下如果定時如果要求不太精確的話,使用alarm()和signal()就行了(精確到秒),但是如果想要實現精度較高的定時功能的話,就要使用setitimer函式。
setitimer()為linux的api,並非c語言的standard library,setitimer()有兩個功能,一是指定一段時間後,才執行某個function,二是每間格一段時間就執行某個function, 以下程式demo如何使用setitimer()。
2.函式引數
1其中,which為定時器型別,3中型別定時器如下:int setitimer(int which, const
struct itimerval *value, struct itimerval *ovalue));23
struct
itimerval ;
7struct
timeval ;
itimer_real : 以系統真實的時間來計算,它送出sigalrm訊號。
itimer_virtual : -以該程序在使用者態下花費的時間來計算,它送出sigvtalrm訊號。
itimer_prof : 以該程序在使用者態下和核心態下所費的時間來計算,它送出sigprof訊號。
第二個引數指定間隔時間,第三個引數用來返回上一次定時器的間隔時間,如果不關心該值可設為null。
it_interval指定間隔時間,it_value指定初始定時時間。如果只指定it_value,就是實現一次定時;如果同時指定 it_interval,則超時後,系統會重新初始化it_value為it_interval,實現重複定時;兩者都清零,則會清除定時器。
tv_sec提供秒級精度,tv_usec提供微秒級精度,以值大的為先,注意1s = 1000000us。
如果是以setitimer提供的定時器來休眠,只需阻塞等待定時器訊號就可以了。
setitimer()呼叫成功返回0,否則返回-1。
3.範例
該示例程式每隔1s產生一行標準輸出。
#include //printf()
#include //
pause()
#include //
signal()
#include //
memset()
#include //
struct itimerval, setitimer()
static
int count = 0
;void
printmes(int signo)
intmain()
return0;
}
Linux應用層定時器
alarm會設定乙個定時器,當時間到期後會觸發sigalrm訊號,該訊號可能會打斷系統呼叫的執行,它使用的定時器和setitimer對應的itimer real是同乙個。include include include include include include include include i...
應用層定時器 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,則之前設定的鬧...