最近学习、研究Linux基于文件描述符的定时器应用。相关介绍N多,这里讲碰到的问题记录、说明下。
这个主要有三个相关函数:
1、timerfd_create(int clockid, int flags)
说明:创建一个timer fd;
1-1、clockid:可以是CLOCK_MONOTONIC或者CLOCK_REALTIME。
说明:CLOCK_MONOTONIC是机器启动到现在为止的时间,所以,这个值不是很大(用clock_gettime测试);CLOCK_REALTIME是系统时间,这个值是比较大的(就是1970到现在的时间);所以,如果clockid为CLOCK_MONOTONIC,那么只能用clock_gettime获取时间,因为暂时我只知道这个函数可以获取这种时间;
1-2、flags:可以是0或者O_CLOEXEC/O_NONBLOCK。
说明:如果是用轮询技术,那么就是非阻塞的O_NONBLOCK。
2、timerfd_settime(int ufd, int flags, const struct itimerspec * new_value, struct itimerspec * old_value);
说明:设置定时器;
2-1、ufd:是timerfd_create返回的文件句柄。
2-2、两个时间参数:new_value是设置超时时间;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 */
};
2-3、flags:为1(TFD_TIMER_ABSTIME)代表设置的是绝对时间;为0代表相对时间。说明:(1)非常要注意,这里的相对时间,指的是timerfd_settime为开始的;所以,如果flags为0,那么,直接设置new_value.it_value值为超时间隔时间,比如说1s,那么设置new_value.it_value.tv_sec为1!!!切记切记(我就是没搞明白,设置了这个参数,导致一直阻塞在那里)
(2)如果flag设置为1,那么,超时时间设置:new_value.it_value先获取当前时间,然后加上超时时间(比如1秒);同时,还可以设置new_value.it_interval,比如设置为2s。效果就是在超时时间过了之后,每次再过2s,超时。
3、timerfd_gettime
说明:获取定时时间(即上次的设置的失效时间)【反正我是没用到】
主要参考文章:
http://blog.youkuaiyun.com/echoisland/article/details/6881368
http://fpcfjf.wap.blog.163.com/w2/blogDetail
http://carmark.iteye.com/blog/1026857