当前位置:   article > 正文

linux timerfd_settime函数,linux新增timerfd接口详解

linux timerfd_settime

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函数,其目的也是和timer,Event一样的,创建可以监听的文件描述符。方面使用poll、select函数。

是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函数,其目的也是和timer,Event一样的,创建可以监听的文件描述符。方面使用poll、select函数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/471014
推荐阅读
相关标签
  

闽ICP备14008679号