Linux應用層下定時器函式setitimer

2021-07-25 22:13:15 字數 1356 閱讀 7503

1.介紹

在linux下如果定時如果要求不太精確的話,使用alarm()和signal()就行了(精確到秒),但是如果想要實現精度較高的定時功能的話,就要使用setitimer函式。

setitimer()為linux的api,並非c語言的standard library,setitimer()有兩個功能,一是指定一段時間後,才執行某個function,二是每間格一段時間就執行某個function, 以下程式demo如何使用setitimer()。

2.函式引數

1

int setitimer(int which, const

struct itimerval *value, struct itimerval *ovalue));23

struct

itimerval ;

7struct

timeval ;

其中,which為定時器型別,3中型別定時器如下:

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,則之前設定的鬧...