int create_timer()
{
int ret = 0;
//创建定时器,使用绝对时间
struct timespec now;
ret = clock_gettime(CLOCK_REALTIME,&now);
if(ret < 0)
{
printf("clock gettime fail:%s\n",strerror(errno));
return -1;
}
struct itimerspec new_value;
new_value.it_value.tv_sec = now.tv_sec+1;//1秒后开始执行
new_value.it_value.tv_nsec = now.tv_nsec;
new_value.it_interval.tv_sec = 1;
new_value.it_interval.tv_nsec = 0;
int fd = timerfd_create(CLOCK_REALTIME,0);
if(fd <= 0)
{
printf("time create fail:%s\n",strerror(errno));
return -1;
}
ret = setnonblocking(fd);
if(ret < 0)
{
return -1;
}
ret = timerfd_settime(fd,TFD_TIMER_ABSTIME,&new_value,NULL);
if(ret < 0)
{
printf("timer set fail:%s",strerror(errno));
return -1;
}
return fd;
}
函数说明
1.创建一个定时器描述符timerfd: int timerfd_create(int clockid, int flags);
clockid 有两中类型:CLOCK_REALTIME :绝对时间
CLOCK_MONOTONIC:相对时间。flags可以是0或者O_CLOEXEC/O_NONBLOCK。
返回值:timerfd(文件描述符)
2.用来启动或关闭有fd指定的定时器:
int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);
fd:timerfd,有timerfd_create函数返回
fnew_value:指定新的超时时间,设定new_value.it_value非零则启动定时器,否则关闭定时器,如果new_value.it_interval为0,则定时器只定时一次,即初始那次,否则之后每隔设定时间超时一次
old_value:不为null,则返回定时器这次设置之前的超时时间
flags:1代表设置的是绝对时间;为0代表相对时间。
两个相关结构体
struct itimerspec { struct timespec it_interval; /* Interval for periodic timer */ struct timespec it_value; /* Initial expiration */ };
struct timespec { time_t tv_sec; /* Seconds */ long tv_nsec; /* Nanoseconds */ };
itimerspec就是timerfd要设置的超时结构体,它的成员it_value表示定时器第一次超时时间,it_interval表示之后的超时时间即每隔多长时间超时
设置完成后可以将fd加入epoll中,通过EPOLLIN监听。收到读事件后可用read.
uint64_t exp
s = read(fd, &exp, sizeof(uint64_t)); if (s != sizeof(uint64_t)) handle_error("read");
exp值为1