码迷,mamicode.com
首页 > 其他好文 > 详细

timerfd_create函数

时间:2020-09-17 23:59:02      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:ati   时钟   ges   rspec   val   read   span   系统重启   second   

背景:

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

 




 

timerfd_create函数

标签:ati   时钟   ges   rspec   val   read   span   系统重启   second   

原文地址:https://www.cnblogs.com/xiongxinxzy/p/13660975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!