赞
踩
timerfd是linux提供的定时器机制,基于文件描述符,定时器精度最高可达纳秒级别,可以利用 select()、poll()和 epoll()对 timerfd 文件描述符进行监控。如果定时器到期,会将对应的文件描述符标记为可读。接口包括定时器创建、启动定时器、关闭定时器和删除定时器。头文件#include<sys/timerfd.h>
调用 fork()期间,子进程会继承 timerfd_create()所创建文件描述符的拷贝。这些描述符与父进程的对应描述符均指代相同的定时器对象,任一进程都可读取定时器的到期信息。timerfd_create()创建的文件描述符能跨越 exec()得以保存(除非将描述符置为运行时关闭),已配备的定时器在 exec()之后会继续生成到期通知。
int timerfd_create(int clockid, int flags)
* 功能 : 创建定时器
* 返回值:成功返回定时器文件描述符,失败返回-1
* clockid:可以是CLOCK_REALTIME(实时时钟)或者CLOCK_MONOTONIC(递增时钟),实时时钟可以被系统时间改变,后者不会。
如果这里使用实时时钟,当手动更改系统时间定时器也会受影响,而递增时钟则只受设置的时间值影响。
* flags : 最初实现将参数 flags 预留供未来使用,必须设置为 0;内核从 2.6.27可选项包括TFD_NONBLOCK(非阻塞)和TFD_CLOEXEC
TFD_CLOEXEC
为新的文件描述符设置运行时关闭标志(FD_CLOEXEC)。与 open()标志O_CLOEXEC 适用于相同情况。
TFD_NONBLOCK
为底层的打开文件描述设置 O_NONBLOCK 标志,随后的读操作将是非阻塞式的。这样
设置省却了对 fcntl()的额外调用,却能达到相同效果
阻塞指的是当定时器未超时的时候,如果调用read(timerfd)会阻塞直到定时器超时,如果设置TFD_NONLOCK,则会直接返回并返回-1。
timerfd_create()创建的定时器使用完毕后,应调用 close()关闭相应的文件描述符,以便于
内核能够释放与定时器相关的资源。系统调用 timerfd_settime()可以配备(启动)或解除(停止)由文件描述符 fd 所指代的定时器
int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);
* 功能 定时器启动和关闭
* 返回值 : 成功返回0,失败返回-1,并存储错误码到errno
* fd : 定时器描述符
* flags : 0 或者TFD_TIMER_ABSTIME,0代表相对时间,即相对于当前时间多少,后者是绝对时间。
* new_value: 为定时器指定新设置。
new_value.it_value非0时,用于设置定时器第一次超时时间,为0代表停止定时器
new_value.it_interval:表示第一次超时后下一次超时的时间,为0代表定时器只超时一次
*old_value: 如果不为NULL,返回定时器的前一设置。
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 */
};
int timerfd_gettime(int fd, struct itimerspec *curr_value)
* 功能 获取定时fd所标识定时器的时间间隔以及距离下次定时器到期的
时间
* 返回值 : 0成功 -1失败
* curr_value:间隔以及距离下次到期的时间
curr_value.it_value 中所有字段值均为 0,那么该定时器已经被解除。否则返回是距离定时器下次到期的时间值。
curr_value.it_interval 中两字段值均为 0,那么定时器只会到期一次,到期时间在 curr_value.it_value 中给出
*
* 功能: 和普通描述符一样,用完后使用close释放
* 参数:timerfd为timerfd_create()创建的定时器描述符
*/
close(timerfd);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。