使用timerfd的好處是可以結合epoll或poll或select使用,當超時時間到時epoll等會返回可讀。
1.int timerfd_create(int clockid,int flags)
timerfd_create返回乙個檔案描述符,該檔案描述符和定時器所關聯。
clockid:
clockid可以為clock_realtime或者clock_monotonic。最好使用clock_monotonic,這樣的話即使你改變了系統時鐘的話也不會受到影響,但是clock_realtime會受到硬性。如果對這兩個選項感興趣的話可以自行去網上查寫關於他們的資料。
flags:
flags可以是tfd_nonblock、tfd_cloexec的或。設定tfd_nonblock代表把返回的檔案描述符設定為非阻塞模式,這個和用fcntl設定該檔案描述符的o_nonblock的效果一樣。設定tfp_cloexec代表當執行exec時該檔案描述符會自動關閉。
2.int timerfd_settime(int fd,int flags,const struct itimerspec *new_value,struct itimerspec *old_value)
timerfd_settime可以啟動或者停止定時器。
讓我們先看看兩個結構體:
struct timespec while (0)
static void print_elapsed_time(void)
if (clock_gettime(clock_monotonic, &curr) == -1)
handle_error("clock_gettime");
secs = curr.tv_sec - start.tv_sec;
nsecs = curr.tv_nsec - start.tv_nsec;
if (nsecs < 0)
printf("%d.%03d: ", secs, (nsecs + 500000) / 1000000);
}int main(int argc, char *ar**)
if (clock_gettime(clock_realtime, &now) == -1)
handle_error("clock_gettime");
/* create a clock_realtime absolute timer with initial
expiration and interval as specified in command line */
new_value.it_value.tv_sec = now.tv_sec + atoi(ar**[1]);
new_value.it_value.tv_nsec = now.tv_nsec;
if (argc == 2) else
new_value.it_interval.tv_nsec = 20;
fd = timerfd_create(clock_realtime, 0);
if (fd == -1)
handle_error("timerfd_create");
if (timerfd_settime(fd,tfd_timer_abstime, &new_value, null) == -1)
handle_error("timerfd_settime");
struct itimerspec old_value;
if (timerfd_settime(fd, tfd_timer_abstime, &new_value, &old_value) == -1)
handle_error("timerfd_settime");
print_elapsed_time();
printf("timer started\n");
for (tot_exp = 0; tot_exp < max_exp;)
exit(exit_success);
}
應用層定時器 timerfd
sys timerfd.hint timerfd create int clockid,int flags clock realtime systemwide realtime clock.實時時鐘,真實的時間 clock monotonic 系統啟動後開始計時,從不進行調整和復位,不受系統時鐘修改...
timerfd加epoll實現定時器簡單封裝
封裝了乙個使用timerfd和epoll實現的定時器 我的思路是 標頭檔案 ifndef cctimer h define cctimer h include threadpool.h include include include include include safemap.h typedef...
linux核心定時器
度量時間差 時鐘中斷由系統的定時硬體以週期性的時間間隔產生,這個間隔 頻率 由核心根據hz來確定,hz是乙個與體系結構無關的常數,可配置 50 1200 在x86平台,預設值為1000.每秒鐘產生1000次時鐘中斷 每當時鐘中斷發生時,全域性變數jiffies就加1,因此其記錄了自linux啟動後時...