使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。一 個是用linux內部的三個定時器,另乙個是用sleep, usleep函式讓程序睡眠一段時間,其實,還有乙個方法,那就是用gettimeofday, difftime等自己來計算時間間隔,然後時間到了就執行某一任務,但是這種方法效率低,所以不常用。
首先來看看linux作業系統為每乙個程序提供的3個內部計時器。
itimer_real: 給乙個指定的時間間隔,按照實際的時間來減少這個計數,當時間間隔為0的時候發出sigalrm訊號
itimer_virtual: 給定乙個時間間隔,當程序執行的時候才減少計數,時間間隔為0的時候發出sigvtalrm訊號
itimer_prof: 給定乙個時間間隔,當程序執行或者是系統為程序排程的時候,減少計數,時間到了,發出sigprof訊號,這個和itimer_virtual聯合,常用來計算系統核心時間和使用者時間。
用到的函式有:
#include
<
sys/time.h
>
intgetitimer
(int
which
, struct
itimerval
*value);
intsetitimer
(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秒,再重新計數。
為了幫助你理解這個問題,我們來看乙個例子:
timer1.c
#include
<
sys/time.h
>
#include
<
stdio.h
>
#include
<
unistd.h
>
#include
<
signal.h
>
#include
<
string.h
>
static
charmsg
= "time is running out/n
";static
intlen
;// 向標準錯誤輸出資訊,告訴使用者時間到了
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以及usleep怎麼實現定時執行任務。
timer2.c
#include
<
signal.h
>
#include
<
unistd.h
>
#include
<
string.h
>
#include
<
stdio.h
>
static
charmsg
= "i received a msg./n
";intlen
;void
show_msg
(int
signo
)int
main
()return0;
} 看到了吧,這個要比上面的簡單多了,而且你用秒錶測一下,時間很準,指定2秒到了就給你輸出乙個字串。所以,如果你只做一般的定時,到了時間去執行乙個任務,這種方法是最簡單的。
下面我們來看看,通過自己計算時間差的方法來定時:
timer3.c
#include
<
signal.h
>
#include
<
unistd.h
>
#include
<
string.h
>
#include
<
stdio.h
>
#include
<
time.h
>
static
charmsg
= "i received a msg./n
";intlen
;static
time_t
lasttime
;void
show_msg
(int
signo
)int
main()}
return0;
} 這個和上面不同之處在於,是自己手工計算時間差的,如果你想更精確的計算時間差,你可以把 time 函式換成gettimeofday,這個可以精確到微妙。
上面介紹的幾種定時方法各有千秋,在計時效率上、方法上和時間的精確度上也各有不同,採用哪種方法,就看你程式的需要
Linux定時器的使用
使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。乙個是用linux內部的三個定時器,另乙個是用sleep,usleep函式讓程序睡眠一段時間,使用alarm定時發出乙個訊號,還有那就是用gettimeofday,...
linux定時器的使用
使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。乙個是用linux內部的三個定時器,另乙個是用sleep,usleep函式讓程序睡眠一段時間,其實,還有乙個方法,那就是用gettimeofday,difftime...
linux定時器的使用
首先來看看linux作業系統為每乙個程序提供的3個內部計時器。itimer real 給乙個指定的時間間隔,按照實際的時間來減少這個計數,當時間間隔為0的時候發出sigalrm訊號 itimer virtual 給定乙個時間間隔,當程序執行的時候才減少計數,時間間隔為0的時候發出sigvtalrm訊...