timerfd_create函數


背景:

muduo網絡庫中選擇了timefd_*系列函數來進行定時,之所以選擇這一組函數的原因是:

1、這一組函數不涉及到信號,安全好用。

2、這一組函數通過操作時間相關的文件描述符實現功能,可以和其它的文件相關操作融為一體。

 

書上242頁原話:

timerf_create(2)函數把時間變成了一個描述符,該文件描述符在定時器超時的那一刻變得可讀,這樣就方便融入select(2)或poll(2)中去。

 

 

下面翻譯官方說明:

       #include <sys/timerfd.h>

       int timerfd_create(int clockid, int flags);

       int timerfd_settime(int fd, int flags,
                           const struct itimerspec *new_value,
                           struct itimerspec *old_value);

       int timerfd_gettime(int fd, struct itimerspec *curr_value);

 

描述:

 

這些系統調用創造和操作一個timer,通過文件描述符傳遞一個定時器的到期通知。這些函數提供了一個setitimer(2) or timer_create(2)函數的可替換方案,但是它可以文件描述符實現和

poll和epoll的統一管理。

這三個函數的應用和timer_creat(2),  timer_setting(2), timer_getting(2)很相似(這兒沒有和timer_getoverrun(2)對比,原因是這個功能由read(2)提供,就像下面所描述的)

timerfd_create()

timerfd_create() 創建一個新的timer對象,返回一個文件描述符對應於這個timer. 

 

clockid參數指定時鍾,用於標志timer的進度,它必須是下面的一個:

 CLOCK_REALTIME

一個可設置的系統范圍的實時時鍾。

CLOCK_MONOTONIC
一個不可設置的單調遞增的時鍾,從過去未指定的某個時間點開始測量時間,時間在系統啟動后不會再改變。

 

flags參數:

TFD_NONBLOCK   : 置位O_NONBLOCK參數

TFD_CLOEXEC       : 置位O_CLOEXEC 參數

 

1 CLOCK_MONOTONIC(即monotonic time)
CLOCK_MONOTONIC:以絕對時間為准,獲取的時間為系統重啟到現在的時間,更改系統時間對它沒有影響。
字面意義:單調時間,表示系統啟動后流逝的時間,由變量jiffies來記錄的。
系統每次啟動時,jiffies初始化為0。每來一個timer interrupt,jiffies加1,即它代表系統啟動后流逝的tick數。
jiffies一定是單調遞增的,因為時間不可逆。

 

2 CLOCK_REALTIME(即wall time)

CLOCK_REALTIME:相對時間,從1970.1.1到目前的時間。更改系統時間會更改獲取的值。它以系統時間為坐標。
字面意思: wall time掛鍾時間,表示現實的時間,由變量xtime來記錄的。
系統每次啟動時,將CMOS上的RTC時間讀入xtime,這個值是”自1970-01-01起經歷的秒數、本秒中經歷的納秒數”。每來一個timer interrupt,也需要去更新xtime。
wall time不一定是單調遞增的。因為wall time是指現實中的實際時間,如果系統要與網絡中某個節點時間同步、或者由系統管理員覺得這個wall time與現實時間不一致,有可能任意的改變這個wall time。

 

 timerfd_settime

       int timerfd_settime(int fd, int flags,
                           const struct itimerspec *new_value,
                           struct itimerspec *old_value);

先來看看這個結構體:

struct timespec {
               time_t tv_sec;                /* Seconds */
               long   tv_nsec;               /* Nanoseconds */
           };

           struct itimerspec {
               struct timespec it_interval;  /* Interval for periodic timer */
               struct timespec it_value;     /* Initial expiration */
           };

這兩個結構提的意思還是十分明確的timespec表示時間,分別記錄的是秒和毫秒。itimerspec用於設置定時器的工作方式:

它的成員it_value表示定時器第一次超時時間,it_interval表示之后的超時時間即每隔多長時間超時。

fnew_value:指定新的超時時間,設定new_value.it_value非零則啟動定時器,否則關閉定時器,如果new_value.it_interval為0,則定時器只定時一次,即初始那次,否則之后每隔設定時間超時一次

old_value:不為null,則返回定時器這次設置之前的超時時間

flags:1代表設置的是絕對時間;為0代表相對時間。

 

int timerfd_gettime(int fd, struct itimerspec *curr_value);

 




 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM