linux定時器的使用

2021-04-24 10:38:43 字數 3263 閱讀 2195

使用定時器的目的無非是為了週期性的執行某一任務,或者是到了乙個指定時間去執行某乙個任務。要達到這一目的,一般有兩個常見的比較有效的方法。一 個是用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訊...