描述符相關的時間定時器

2021-06-26 02:00:33 字數 3523 閱讀 2362

描述符相關的定時器是指可以通過描述符進行操作的一種定時器。

下面根據man pages提供的例子學習該定時器的具體應用。

主要標頭檔案和函式有

#include

int timerfd_create(int clockid, int flags);

clockid 可為clock_monotonic 或者 clock_realtime;

clock_realtime:真實時間型別,修改時鐘會影響定時器;系統實時時間,隨系統實時時間改變而改變,即從utc1970-1-1 0:0:0開始計時;

clock_monotonic:相對時間型別,修改時鐘不影響定時器;從系統啟動這一刻起開始計時,不受系統時間被使用者改變的影響 ;

int timerfd_settime(int fd, int flags,

const struct itimerspec *new_value,

struct itimerspec *old_value);

引數flags為tfd_timer_abstime代表設定的是絕對時間;

為0代表相對時間。後面會舉例子說明兩者的區別。

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

**例子:

#include #include #include #include #include #include /* definition of uint64_t */

#define handle_error(msg) \

do 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);

}intmain(int argc, char *argv)

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(argv[1]);

new_value.it_value.tv_nsec = now.tv_nsec;

if (argc == 2) else

new_value.it_interval.tv_nsec = 0;

fd = timerfd_create(clock_realtime, 0);

if (fd == -1)

handle_error("timerfd_create");

//tfd_timer_abstime

if (timerfd_settime(fd, tfd_timer_abstime, &new_value, null) == -1)

handle_error("timerfd_settime");

print_elapsed_time();

printf("timer started\n");

for (tot_exp = 0; tot_exp < max_exp;)

exit(exit_success);

}

**片段2:

兩個程式的效果是一樣,區別是 timerfd_settime() flag引數由tfd_timer_abstime 改為 0注意觀察第二個引數賦值的變化;

#include #include #include #include #include #include /* definition of uint64_t */

#define handle_error(msg) \

do 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);

}intmain(int argc, char *argv)

if (clock_gettime(clock_realtime, &now) == -1)

handle_error("clock_gettime");

/* create a clock_realtime relative timer with initial

expiration and interval as specified in command line */

//new_value.it_value.tv_sec = now.tv_sec + atoi(argv[1]);

//new_value.it_value.tv_nsec = now.tv_nsec;

new_value.it_value.tv_sec = atoi(argv[1]);//modify

new_value.it_value.tv_nsec = 0;//modify

if (argc == 2) else

new_value.it_interval.tv_nsec = 0;

fd = timerfd_create(clock_realtime, 0);

if (fd == -1)

handle_error("timerfd_create");

//tfd_timer_abstime modify to 0, relative timer

if (timerfd_settime(fd, 0, &new_value, null) == -1)

handle_error("timerfd_settime");

print_elapsed_time();

printf("timer started\n");

for (tot_exp = 0; tot_exp < max_exp;)

exit(exit_success);

}

利用檔案描述符進行通知的定時器 timerfd

timerfd api 是linux系統特有的,linux是在核心版本2.6.25中提供的。它可以從檔案描述符中讀取所建立定時器的到期通知。因為可以使用select poll 和epoll 將這種檔案描述符同其他描述符一同進行監控。這組api中的3個系統呼叫,其操作與timer create tim...

神奇的描述符(一) 描述符協議的實現

描述符通過描述符協議實現,任何實現或部分實現以下方法的類,都可以作為描述符使用。def get self,instance,owner def set self,instance,value def delete self,instance get 方法接收三個引數 self為描述符例項自身 ins...

Linux 檢視檔案描述符相關 資訊

1.檢視系統當前使用的檔案描述符個數 root imx6qsabresd cat proc sys fs file nr 864 0 69474 第一列 1216 為已分配的fd數量 第二列 0 為已分配但尚未使用的fd數量 第三列197787 為系統可用的最大fd數量 已用fd數量 為已分配的fd...