Linux中Posix定時器函式的使用介紹

2021-10-08 14:04:49 字數 3594 閱讀 4122

int timer_create(clockid_t clockid, struct sigevent *sevp,timer_t timerid)

功能: 建立定時器

描述: 函式 timer_create 會建立乙個timer(每程序), 返回的timer id 在呼叫程序中是唯一的, 建立後的timer處於停止(disarmed)狀態.

引數:clock_id

說明定時器是基於哪個時鐘的,可有以下取值:

clock_realtime :systemwide realtime clock.(系統實時時間,即日曆時間)

clock_monotonic:represents monotonic time. cannot be set.(從系統啟動開始到現在為止的時間)

3.clock_process_cputime_id :high resolution per-process timer(本程序啟動到執行到當前**,系統cpu花費的時間).

clock_thread_cputime_id :thread-specific timer(本執行緒啟動到執行到當前**,系統cpu花費的時間).

5.clock_realtime_hr :high resolution version of clock_realtime(clock_realtime的細粒度(高精度)版本).

6.clock_monotonic_hr :high resolution version of clock_monotonic(clock_monotonic的細粒度版本).

sevp

設定了定時器到期時的通知方式和處理方式(結構體詳細定義參見下方)

該型別結構體使用前要初始化(memset等), 否則可能出現timer到期無動作的異常情況.

timerid

建立的timer的id 通過這個指標返回.

返回值on success,return 0.on error,-1 is returned,and errno is set to indicate the error.

int timer_delete (timer_t timerid)

功能: 通過timder id刪除指定的 timer

描述: 如果呼叫這個函式時,timer處於啟用(armed)狀態, 刪除前會先將這個timer狀態變更為未啟用(disarmed)狀態.

掛起等待timer(刪除的)產生訊號的行為是未定義的.

引數timerid

指定的timer

返回值on success,return 0.on error,-1 is returned,and errno is set to indicate the error.

int timer_settime(timer_t timerid, int flags,const struct itimerspec *new_value,struct itimerspec *old_value)

功能: 啟動/停止或重置定時器

timerid 指定的 timer

flags

0 :new_value->it_value 表示希望timer首次到期時的時間與啟動timer的時間間隔.

timer_abstime:new_value->it_value 表示希望timer首次到期的絕對時間.

(如果new_value->it_value 設定的絕對時間 早於 當前的絕對時間, 那麼timer會立即到期.)

(如果時鐘 clock_realtime 被調整了,那麼timer的首次過期時間也會適當調整.)

old_value

取得上一次的設定的new_value

返回值on success,return 0.on error,-1 is returned,and errno is set to indicate the error.

int timer_gettime(timer_t timerid, struct itimerspec *curr_value)

功能: 獲得定時器的到期時間和間隔

curr_value

curr_value->it_value : 離timer到期的剩餘時間

curr_value->it_interval : timer的迴圈時間間隔

int timer_getoverrun(timer_t timerid)

功能: 獲得定時器超限的次數

描述:當乙個timer到期並且上一次到期時產生的訊號還處於掛起狀態時,不會產生新的訊號(即丟棄乙個訊號),這就是定時器超限(overrun), 丟棄的訊號數量就是 overrun count。

對於乙個給定的timer, 在任何時間點只能有乙個訊號在程序中排隊, 這是posix.1-2001中指定的, 因為不這樣做,排隊訊號的數量很容易達到系統的上限.

因為系統排程延遲或者訊號被暫時阻塞都會造成訊號產生到訊號被傳送( (e.g., caught by a signal handler))或者接收((e.g., using sigwaitinfo(2)))之間有乙個延遲的時間段,在這個時間段中可能會有多次的timer到期.

程式可以通過呼叫timer_getoverrun來確定乙個指定的定時器出現這種超限的次數, 從而精確能精確的計算出在給定時間內timer到期了多少次。

定時器超限只能發生在同乙個定時器產生的訊號上。多個定時器,甚至是那些使用相同的時鐘和訊號的定時器,所產生的訊號都會排隊而不會丟失。

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

struct sigevent結構的定義如下

struct sigevent

union si**al

如果sevp傳入null,那麼定時器到期會產生預設的訊號,對clock_realtimer來說,預設訊號就是sigalrm,如果要產生除預設訊號之外的其他訊號,程式必須將evp->sigev_signo設定為期望的信號碼。

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作為乙個引數。

struct itimerspec結構的定義如下:

struct itimerspec; 

struct timespec

;

定時器工作時,先將it_value的時間值減到0,傳送乙個訊號,再將it_interval的值賦給it_value,重新開始定時,如此反覆。如果it_value值被設定為0,則定時器停止定時;如果it_interval等於0,那麼表示該定時器不是乙個時間間隔定時器,一旦it_value到期後定時器就回到未啟動狀態。

案例:

#include#include #include void  function_timer()

int main(int argc,char *ar**)

}

Linux中的定時器

linux中乙個比較簡單的計時器是alarm 和 signal 如果要求不很精確的話,用它們兩個配合就足夠了。從alarm這個名字的意思 警告 就可以看出,此計時器在設計時,也許就僅僅只是提供給呼叫者用來做警告 使用的。宣告如下 unsigned int alarm unsigned int sec...

linux中定時器 setitimer

參考文件 1 2 3 在參考文獻 1 中提到了 在linux下如果定時如果要求不太精確的話,使用alarm 和signal 就行了 精確到秒 但是如果想要實現精度較高的定時功能的話,就要使用setitimer函式。因為我一開始就查的是setitimer函式,所以這裡先介紹下這個函式吧。一 函式原型 ...

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檔案的一些例子 ...