linux新增timerfd接口详解

来源:互联网 发布:淘宝卖家怎么看权重 编辑:程序博客网 时间:2024/06/04 19:41

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函数。

原创粉丝点击