linux新增timerfd接口详解

timerfd是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,所以能够被用于select/poll的应用场景。

1.      使用方法

timerfd提供了如下接口供用户使用

timerfd_create

inttimerfd_create(int clockid, int flags);

timerfd_create用于创建一个定时器文件。

参数clockid可以是CLOCK_MONOTONIC或者CLOCK_REALTIME。

参数flags可以是0或者O_CLOEXEC/O_NONBLOCK。

(

O_CLOEXEC : 用于多线程,在创建新线程时,会拷贝原来线程打开的文件描述符,但是对于新线程来说并不需要,加上这个标志位以后,在创建线程时会自动关闭这些描述符。

)

函数返回值是一个文件句柄fd。

timerfd_settime

inttimerfd_settime(int ufd, int flags, const struct itimerspec * utmr, structitimerspec * otmr);

此函数用于设置新的超时时间,并开始计时。

参数ufd是timerfd_create返回的文件句柄。

参数flags为1代表设置的是绝对时间;为0代表相对时间。

参数utmr为需要设置的时间。

参数otmr为定时器这次设置之前的超时时间。

函数返回0代表设置成功。

           struct timespec {

               time_t tv_sec;                /* Seconds */

               long   tv_nsec;               /* Nanoseconds */

          };

           struct itimerspec {

               struct timespecit_interval;  /* Interval for periodictimer 第一次以后的超时周期*/

               struct timespec it_value;     /* Initial expiration 初次超时时间*/

           };

比如it_value,it_interval分别设置为2,5,那么超时时间分别为2,7,12…

timerfd_gettime

inttimerfd_gettime(int ufd, struct itimerspec * otmr);

此函数用于获得定时器距离下次超时还剩下的时间。如果调用时定时器已经到期,并且该定时器处于循环模式(设置超时时间时struct itimerspec::it_interval不为0),那么调用此函数之后定时器重新开始计时。

read

当timerfd为阻塞方式时,read函数将被阻塞,直到定时器超时。

函数返回值大于0,代表定时器超时;否则,代表没有超时(被信号唤醒,等等)。

Read成功返回时,buf里存储的是一个8字节的无符号整数,该整数表示从上次被捕获到超时信号到现在超时的次数。

比如:it_value,it_interval分别设置为2,1, 程序运行开启定时器之后马上睡眠8秒,这是read的buf得到的值应该为7,表明已经超时7次。

poll/close

poll,close与标准文件操作相同。

 

题外话:另外linux-2.6.22内核也新增了signalfd函数,其目的也是和timerEvent一样的,创建可以监听的文件描述符。方面使用pollselect函数。

是Linux为用户程序提供的一个定时器接口。这个接口基于文件描述符,所以能够被用于select/poll的应用场景。

1.      使用方法

timerfd提供了如下接口供用户使用

timerfd_create

inttimerfd_create(int clockid, int flags);

timerfd_create用于创建一个定时器文件。

参数clockid可以是CLOCK_MONOTONIC或者CLOCK_REALTIME。

参数flags可以是0或者O_CLOEXEC/O_NONBLOCK。

(

O_CLOEXEC : 用于多线程,在创建新线程时,会拷贝原来线程打开的文件描述符,但是对于新线程来说并不需要,加上这个标志位以后,在创建线程时会自动关闭这些描述符。

)

函数返回值是一个文件句柄fd。

timerfd_settime

inttimerfd_settime(int ufd, int flags, const struct itimerspec * utmr, structitimerspec * otmr);

此函数用于设置新的超时时间,并开始计时。

参数ufd是timerfd_create返回的文件句柄。

参数flags为1代表设置的是绝对时间;为0代表相对时间。

参数utmr为需要设置的时间。

参数otmr为定时器这次设置之前的超时时间。

函数返回0代表设置成功。

           struct timespec {

               time_t tv_sec;                /* Seconds */

               long   tv_nsec;               /* Nanoseconds */

          };

           struct itimerspec {

               struct timespecit_interval;  /* Interval for periodictimer 第一次以后的超时周期*/

               struct timespec it_value;     /* Initial expiration 初次超时时间*/

           };

比如it_value,it_interval分别设置为2,5,那么超时时间分别为2,7,12…

timerfd_gettime

inttimerfd_gettime(int ufd, struct itimerspec * otmr);

此函数用于获得定时器距离下次超时还剩下的时间。如果调用时定时器已经到期,并且该定时器处于循环模式(设置超时时间时struct itimerspec::it_interval不为0),那么调用此函数之后定时器重新开始计时。

read

当timerfd为阻塞方式时,read函数将被阻塞,直到定时器超时。

函数返回值大于0,代表定时器超时;否则,代表没有超时(被信号唤醒,等等)。

Read成功返回时,buf里存储的是一个8字节的无符号整数,该整数表示从上次被捕获到超时信号到现在超时的次数。

比如:it_value,it_interval分别设置为2,1, 程序运行开启定时器之后马上睡眠8秒,这是read的buf得到的值应该为7,表明已经超时7次。

poll/close

poll,close与标准文件操作相同。

 

题外话:另外linux-2.6.22内核也新增了signalfd函数,其目的也是和timerEvent一样的,创建可以监听的文件描述符。方面使用pollselect函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值