linux程式設計之定時器

2021-08-26 10:21:17 字數 3123 閱讀 3824

建立乙個定時器:

int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid)

程序可以通過呼叫timer_create()建立特定的定時器,定時器是每個程序自己的,不是在fork時繼承的。clock_id說明定時器是基於哪個時鐘的,*timerid裝載的是被建立的定時器的id。該函式建立了定時器,並將他的id放入timerid指向的位置中。引數evp指定了定時器到期要產生的非同步通知。如果evp為null,那麼定時器到期會產生預設的訊號,對clock_realtimer來說,預設訊號就是sigalrm。如果要產生除預設訊號之外的其它訊號,程式必須將evp->sigev_signo設定為期望的信號碼。structsigevent結構中的成員evp->sigev_notify說明了定時器到期時應該採取的行動。通常,這個成員的值為sigev_signal,這個值說明在定時器到期時,會產生乙個訊號。程式可以將成員evp->sigev_notify設為sigev_none來防止定時器到期時產生訊號。

如果幾個定時器產生了同乙個訊號,處理程式可以用evp->sigev_value來區分是哪個定時器產生了訊號。要實現這種功能,程式必須在為訊號安裝處理程式時,使用structsigaction的成員

sa_flags中的標誌符sa_siginfo。

clock_id取值為以下:

clock_realtime:systemwiderealtimeclock.

clock_monotonic:representsmonotonictime.cannotbeset.

clock_process_cputime_id:highresolutionper-processtimer.

clock_thread_cputime_id:thread-specifictimer.

clock_realtime_hr:highresolutionversionofclock_realtime.

clock_monotonic_hr:highresolutionversionofclock_monotonic.

structsigevent

unionsigval

通過將evp->sigev_notify設定為如下值來定製定時器到期後的行為:

sigev_none:什麼都不做,只提供通過timer_gettime和timer_getoverrun查詢超時資訊。

sigev_signal:

當定時器到期,核心會將sigev_signo所指定的訊號傳送給程序。在訊號處理程式中,si_value會被設定會sigev_value。

sigev_thread:

當定時器到期

,核心會(在此程序內)

以sigev_notification_attributes為執行緒屬性建立乙個執行緒,並且讓它執行sigev_notify_function,傳入sigev_value作為為乙個引數。

啟動乙個定時器:

timer_create()所建立的定時器並未啟動。要將它關聯到乙個到期時間以及啟動時鐘週期,可以使用timer_settime()。

int timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspect *ovalue);

struct itimespec;

如同settimer(),it_value用於指定當前的定時器到期時間。當定時器到期,it_value的值會被更新成it_interval 的值。如果it_interval的值為0,則定時器不是乙個時間間隔定時器,一旦it_value到期就會回到未啟動狀態。

timespec的結構提供了納秒級解析度:

struct timespec;

如果flags的值為timer_abstime,則value所指定的時間值會被解讀成絕對值(此值的預設的解讀方式為相對於當前的時間)。這個經修改的行為可避免取得當前時間、計算「該時間」與「所期望的未來時間」的相對差額以及啟動定時器期間造成競爭條件。

如果ovalue的值不是null,則之前的定時器到期時間會被存入其所提供的itimerspec。如果定時器之前處在未啟動狀態,則此結構的成員全都會被設定成0。

inttimer_gettime(timer_ttimerid,structitimerspec*value);

取得乙個定時器的超限

執行次數:

有可能乙個定時器到期了,而同一定時器上一次到期時產生的訊號還處於掛起狀態。在這種情況下,其中的乙個訊號可能會丟失。這就是定時器超限。程式可以通過呼叫timer_getoverrun來確定乙個特定的定時器出現這種超限的次數。定時器超限只能發生在同乙個定時器產生的訊號上。由多個定時器,甚至是那些使用相同的時鐘和訊號的定時器,所產生的訊號都會排隊而不會丟失。

inttimer_getoverrun(timer_ttimerid);

執行成功時,timer_getoverrun()會返回定時器初次到期與通知程序(例如通過訊號)定時器已到期之間額外發生的定時器到期次數。舉例來說,在我們之前的例子中,乙個1ms的定時器執行了10ms,則此呼叫會返回9。

如果超限執行的次數等於或大於delaytimer_max,則此呼叫會返回delaytimer_max。

執行失敗時,此函式會返回-1並將errno設定會einval,這個唯一的錯誤情況代表timerid指定了無效的定時器。

刪除乙個定時器:

int timer_delete (timer_t timerid);

一次成功的timer_delete()呼叫會銷毀關聯到timerid的定時器並且返回0。執行失敗時,此呼叫會返回-1並將errno設定會 einval,這個唯一的錯誤情況代表timerid不是乙個有效的定時器。

例1:void handle()

int main()

例2:void handle(union sigval v)

int main()

linux 定時器程式設計

在編寫應用程式的時候,經常需要用到定時器。根據使用情況,定時器的基本行為分為2種 single shot timer和repeating timer single shot timer 從註冊到終止只執行一次。repeating timer每次終止後自動執行。linux 在定時程式設計有以下幾種介面...

Linux 定時器程式設計小解

基礎知識 全域性變數 jiffies 記錄時鐘中斷的次數,也就是system clk的節拍數 全域性變數 hz 記錄1秒鐘系統來幾個節拍,系統節拍頻率 很容易得到公式 系統執行的秒數 second jiffies hz static struct timer list my timer 定義乙個軟體...

多執行緒之 定時器

對於定時器,想必生活中用到的不少吧,比如我設定個定時炸彈,又比如我設定的鬧鐘,都是定時器的實現原理,那麼定時器在多執行緒中怎麼實現的吶,是通過這個類 timer 直接看 吧,public class traditionaltimetest 10000,1000 class mytimer exten...