linux 定时器 timefd

//创建定时器,1秒执行一次
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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值