标签: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);
标签:ati 时钟 ges rspec val read span 系统重启 second
原文地址:https://www.cnblogs.com/xiongxinxzy/p/13660975.html