赞
踩
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函数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。