Linux定时器描述符(timerfd)shiy


    最近学习、研究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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值