參考文件
(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檔案的一些例子 ...