linux中定時器 setitimer

2021-07-04 21:01:07 字數 1698 閱讀 3384

參考文件

(1)(2)

(3)

在參考文獻(1)中提到了「在linux下如果定時如果要求不太精確的話,使用alarm()和signal()就行了(精確到秒),但是如果想要實現精度較高的定時功能的話,就要使用setitimer函式。」因為我一開始就查的是setitimer函式,所以這裡先介紹下這個函式吧。

一、 函式原型

int setitimer(intwhich, const struct itimerval *value

, struct itimerval *ovalue);

呼叫成功返回0,否則返回-1

which : 定時器型別,有3種選擇

itimer_real:以系統真實事件來計算,它送出sigalrm訊號。

itimer_virtual:以該程序在使用者態下話費的時間來計算,它送出sigvtalrm訊號。

itimer_prof:以該程序在使用者態下和核心態下所話費的時間來計算,它送出sigprof訊號。

value:其定義如下

struct   itimerval

struct  timeval

ovalue:用來儲存先前的值,一般為null。如果不是null,將返回計時器原有值。

二、 程式例程

1.  示例1

#include #include #include #include #include #include void func1()

int main(void)

}

結果就是每隔3s列印一次內容。當執行完setitimer後,第一次是等1s就開始列印了,但後面每次都等待3s列印。

2. 示例2

#include #include #include #include #include #include void func1()

void func2()

int main(void)

}

這個每次間隔20s進行一次列印,結果如下:

這裡要特別做如下的說明:

乙個程序只能使用乙個setitimer函式,這個並不想qt裡面的訊號與槽的這種機制,其實其只發出乙個sigalrm,與定義了多少個itimerval型別的變數無關。所以如果有兩個setitimer函式,第二個函式會把第一次呼叫時設定的引數給覆蓋了。第一次定義的是每個3s執行一次,第二次定義的是每個20s執行一次,實際上程式執行後,列印的節奏確實是20s執行一次。signal函式雖然設定了兩次,同樣第二次把第一次給覆蓋了,當計時時間到了,並不會執行func1函式,而是會執行func2函式。

後面再研究參考文獻(1)中提到的alarm()和signal()方法,另外一點就是,setitimer

函式底層如何進行微秒級的乙個定時的,核心中驅動如何處理的。

歡迎交流共同學習 qq群:485158261

Linux應用層下定時器函式setitimer

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

Linux中的定時器

linux中乙個比較簡單的計時器是alarm 和 signal 如果要求不很精確的話,用它們兩個配合就足夠了。從alarm這個名字的意思 警告 就可以看出,此計時器在設計時,也許就僅僅只是提供給呼叫者用來做警告 使用的。宣告如下 unsigned int alarm unsigned int sec...

linux中crontab定時器

基本格式 由6個部分組成 command 分 時 日 月 周 命令 第1列 表示分鐘1 59 每分鐘用 或者 1表示 第2列 表示小時1 23 0表示0點 第3列 表示日期1 31 第4列 表示月份1 12 第5列 標識號星期0 6 0表示星期天 第6列 要執行的命令 crontab檔案的一些例子 ...