linux定時器timerfd系列函式學習

2021-09-20 06:39:28 字數 1988 閱讀 4250

使用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啟動後時...