最近在测试刚写的muduo reactor程序时用到了timerfd定时器,因为初始化的问题检查muduo程序检查了许久也没有发现问题,后来才发现是测试程序的问题,结构体没有初始化!!!
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 (第一次超时时间)*/
};
2.使用方法
timerfd计时器使用起来也非常简便
int timerfd_create(int clockid, int flags);
timerfd_create()函数创建一个定时器对象,同时返回一个与之关联的文件描述符。
clockid:clockid标识指定的时钟计数器,可选值(CLOCK_REALTIME、CLOCK_MONOTONIC。。。)
CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,中间时刻如果系统时间被用户改成其他,则对应的时间相应改变
CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
flags:参数flags(TFD_NONBLOCK(非阻塞模式)/TFD_CLOEXEC(表示当程序执行exec函数时本fd将被系统自动关闭,表示不传递)
int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);
13
14 timerfd_settime()此函数用于设置新的超时时间,并开始计时,能够启动和停止定时器;
15 fd: 参数fd是timerfd_create函数返回的文件句柄
16 flags:参数flags为1代表设置的是绝对时间(TFD_TIMER_ABSTIME 表示绝对定时器);为0代表相对时间。
17 new_value: 参数new_value指定定时器的超时时间以及超时间隔时间
18 old_value: 如果old_value不为NULL, old_vlaue返回之前定时器设置的超时时间,具体参考timerfd_gettime()函数
19
20 ** it_interval不为0则表示是周期性定时器。
21 it_value和it_interval都为0表示停止定时器
22
3.代码
int timefd=timer_create(CLOCK_MONOTONIC,TFD_NOBLOCK|TFD_CLOEXEC);
struct itimerspec itime;
//bezero(itime,sizeof(itime)); 漏写了这一句
itime.it_value.tv_sec=3;只进行了部分初始化!!
timerfd_settime(int timefd, int 0, &itime, NULL);//开始计时
因为未进行完整初始化timerfd_settime()函数失败,定时失败,程序中的poll没有接受到timefd的可读事件。
一定要完全初始化!!
不要偷懒