系统调用(timerfd_create/timerfd_settime/timerfd_gettime)创建并操作一个定时器timer,该定时器通过文件描述符fd来传递定时器超时通知。同时文件描述符fd可以被select、poll和epoll监听。
一、相应的数据结构及函数原型
1.1、数据结构
//定时时间的数据结构
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 */
};
1.2、函数原型
int timerfd_create(int clockid, int flags);
用于创建一个新的定时器对象,返回一个引用该定时器的文件描述符。
参数说明:
clockid: 指出用于标记定时器进度的时钟,即使用什么时钟。
可选参数 | 意义 |
---|---|
CLOCK_REALTIME | 可设置的系统范围实时(real-time)时钟 |
CLOCK_MONOTONIC | 不可设置的单调递增时钟(从过去某个未指定的时间点开始测量时间,时间点在系统启动后不会改变) |
flag:改变定时器的行为(可以由以下值相或(OR))。
可选参数 | 意义 |
---|---|
TFD_NONBLOCK | 当open打开文件描述符时该文件描述符的状态为非阻塞模式 |
TFD_CLOEXEC | 当open打开文件描述符时该文件描述符的状态为执行时关闭状态 |
在Linux 2.6.26版本及以下,flag参数必须指定为0。
返回值:
成功返回一个指向定时器的文件描述符fd,失败返回-1并置errno。
int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);
设置定时器时间,激活(启动)或解除(停止)文件描述符fd引用的计时器
参数说明
fd:系统调用timer_create()创建的文件描述符。
flag:位掩码,指定设置的超时时间是否为绝对时间。
可选参数 | 意义 |
---|---|
TFD_TIMER_ABSTIME | 设置的时间为绝对时间 |
TFD_TIMER_CANCEL_ON_SET | 如果flag已经指定为TFD_TIMER_ABSTIME,并且时钟类型为CLOCK_REALTIME,则当实时时钟发生不连续的变化,则将此计时器标记为可取消 |
new_value:设置定时器的初始过期时间和间隔(周期)。
it_value字段中的两个值有一个不为0时,则激活定时器;两个值都为0时则解除定时器;
it_interval字段中的两个值有一个不为0时,则在it_value所设置的定时超时后开始周期性计时;两个值都为0时只计时一次;
默认情况下,new_value中指定的初始过期时间为相对于调用时定时器时钟上的当前时间(由clockid指定的时钟当前值的时间)。
old_value:如果不为NULL,则其指向的itimerspec结构将用于返回调用时当前的定时器设置;
返回值
成功返回0,失败返回-1并置errno。
int timerfd_gettime(