Linux 定时器
time fd
在linux里面可以使用timerfd里面的API来构造定时器,来执行一些定时任务,使用timerfd的好处是可以把定时器当做文件描述符来使用。
相关文件
#include <sys/timerfd.h>
使用代码
struct timespec now;
if (clock_gettime(CLOCK_REALTIME, &now) == -1) {
perror("clock get time error");
}
printf("sec : %ld, nsec : %ld.\n", now.tv_sec, now.tv_nsec);
//获取timer fd
int tfd = timerfd_create(CLOCK_REALTIME, 0);
if (tfd == -1) {
perror("Create fd error");
}
// 设置超时时间
struct itimerspec new_value;
new_value.it_value.tv_sec = now.tv_sec;
new_value.it_value.tv_nsec = now.tv_nsec;
new_value.it_interval.tv_sec = 1;
if (timerfd_settime(tfd, TFD_TIMER_ABSTIME, &new_value, NULL) == -1) {
perror("Set Time Error");
}
//直接使用read来读取
uint64_t max_exp = 10, tot_exp = 0, exp = 0;
for (; tot_exp < max_exp;) {
int s = read(tfd, &exp, sizeof(uint64_t));
if (s != sizeof(uint64_t)) {
perror("Read From FD Error");
}
// deal with time event.
}
注意
1.创建出来的fd和普通的fd没有区别,可以设置NONBLOCK等标志。
2.创建出来的fd可以使用poll,select,epoll等多路复用机制。
3.read出来的buff代表这个fd超时了多少次。
4.如果需要disable掉这个timer fd,需要把tv_sec 和 tv_nsec两个字段设置为零,并且重新settime一次。