Linux定時器的使用

2021-06-04 20:13:44 字數 3218 閱讀 9001

使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。乙個是用linux內部的三個定時器,另乙個是用sleep, usleep函式讓程序睡眠一段時間,使用alarm定時發出乙個訊號,還有那就是用gettimeofday, difftime等自己來計算時間間隔,然後時間到了就執行某一任務,但是這種方法效率低,所以不常用。

alarm

alarm用在不需要經確定時的時候,返回之前剩餘的秒數。

name

alarm - set an alarm clock for delivery of a signal

synopsis

#include

unsigned int alarm(unsigned int seconds);

description

alarm  arranges  for asigalrmsignal to be delivered to the process in

seconds seconds.

if seconds is zero, no new alarm is scheduled.

in any event any previously set alarm is cancelled.

測試程式:

1 cat timer.c

2 #include 

3 #include 

4 #include 

5 #include 

6 7 

void func()8 

11 12 

int main(

)13 

19 

linux內建的3個定時器

linux為每個任務安排了3個內部定時器:

itimer_real:實時定時器,不管程序在何種模式下執行(甚至在程序被掛起時),它總在計數。定時到達,向程序傳送sigalrm訊號。

itimer_virtual:這個不是實時定時器,當程序在使用者模式(即程式執行時)計算程序執行的時間。定時到達後向該程序傳送sigvtalrm訊號。 

itimer_prof:程序在使用者模式(即程式執行時)和核心模式(即程序排程用時)均計數。定時到達產生sigprof訊號。itimer_prof記錄的時間比itimer_virtual多了程序排程所花的時間。

定時器在初始化是,被賦予乙個初始值,隨時間遞減,遞減至0後發出訊號,同時恢復初始值。在任務中,我們可以一種或者全部三種定時器,但同一時刻同一型別的定時器只能使用乙個。

用到的函式有:

#include

int getitimer(int which, struct itimerval *value);

int setitimer(int which, struct itimerval*newvalue, struct itimerval* oldvalue);

strcut timeval

;struct itimerval

;it_interval用來指定每隔多長時間執行任務, it_value用來儲存當前時間離執行任務還有多長時間。比如說, 你指定it_interval為2秒(微秒為0),開始的時候我們把it_value的時間也設定為2秒(微秒為0),當過了一秒, it_value就減少乙個為1, 再過1秒,則it_value又減少1,變為0,這個時候發出訊號(告訴使用者時間到了,可以執行任務了),並且系統自動把it_value的時間重置為it_interval的值,即2秒,再重新計數。

#include

#include

#include

#include

#include

static char msg = "time is running out\n";

static int len;

// 向標準錯誤輸出資訊,告訴使用者時間到了

void prompt_info(int signo)

// 建立訊號處理機制

void init_sigaction(void)

void init_time()

int main()

該程式的itmer_real定時器,每隔2秒鐘都會傳送乙個sigalrm訊號,當主函式接收到了這個訊號之後,呼叫訊號處理函式prompt_info在標準錯誤上輸出time is running out這個字串。

對於itimer_virtual和itimer_prof的使用方法類似,當你在setitimer裡面設定的定時器為itimer_virtual的時候,你把sigaction裡面的sigalrm改為sigvtalarm, 同理,itimer_prof對應sigprof。

不過,你可能會注意到,當你用itimer_virtual和itimer_prof的時候,你拿乙個秒錶,你會發現程式輸出字串的時間間隔會不止2秒,甚至5-6秒才會輸出乙個,至於為什麼,自己好好琢磨一下^_^

sleep

下面我們來看看用sleep以及usleep怎麼實現定時執行任務。

#include

#include

#include

#include

static char msg = "i received a msg.\n";

int len;

void show_msg(int signo)

int main()

return 0;}

看到了吧,這個要比上面的簡單多了,而且你用秒錶測一下,時間很準,指定2秒到了就給你輸出乙個字串。所以,如果你只做一般的定時,到了時間去執行乙個任務,這種方法是最簡單的。

時間差下面我們來看看,通過自己計算時間差的方法來定時:

#include

#include

#include

#include

#include

static char msg = "i received a msg.\n";

int len;

static time_t lasttime;

void show_msg(int signo)

int main()

}return 0;}

這個和上面不同之處在於,是自己手工計算時間差的,如果你想更精確的計算時間差,你可以把 time 函式換成gettimeofday,這個可以精確到微妙。

上面介紹的幾種定時方法各有千秋,在計時效率上、方法上和時間的精確度上也各有不同,採用哪種方法,就看你程式的需要。

linux定時器的使用

使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。一 個是用linux內部的三個定時器,另乙個是用sleep,usleep函式讓程序睡眠一段時間,其實,還有乙個方法,那就是用gettimeofday,difftim...

linux定時器的使用

使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。乙個是用linux內部的三個定時器,另乙個是用sleep,usleep函式讓程序睡眠一段時間,其實,還有乙個方法,那就是用gettimeofday,difftime...

linux定時器的使用

首先來看看linux作業系統為每乙個程序提供的3個內部計時器。itimer real 給乙個指定的時間間隔,按照實際的時間來減少這個計數,當時間間隔為0的時候發出sigalrm訊號 itimer virtual 給定乙個時間間隔,當程序執行的時候才減少計數,時間間隔為0的時候發出sigvtalrm訊...