epoll timer实现定时任务

static int start_histroy_timer(){

    int timerfd = timerfd_create(CLOCK_MONOTONIC,TFD_NONBLOCK);
    if(timerfd ==-1){
        log_printfln(LOG_INFO," histroy_data timerfd_create fail");
        return -1;
    }

    struct itimerspec new_value = {};
    new_value.it_value.tv_sec = 3;    //第一次3s到期
    new_value.it_value.tv_nsec = 0;

    // new_value.it_interval.tv_sec = 10 * 60;  //后续周期是10 min cycle
    new_value.it_interval.tv_sec = 5;  //后续周期是10 min cycle
    new_value.it_interval.tv_nsec = 0;

    if(timerfd_settime(timerfd,0,&new_value,NULL)==-1){
        log_printfln(LOG_INFO," histroy_data timerfd_settime fail");
        return -1;
    }
    log_printfln(LOG_INFO, "histroy_data timer started");
    int epollfd = epoll_create1(EPOLL_CLOEXEC);
    if(epollfd == -1){
        log_printfln(LOG_INFO, "histroy_data epoll_create1 fail");
        return -1;
    }

    struct epoll_event ev;
    ev.events = EPOLLIN;
    ev.data.fd = timerfd;

    epoll_ctl(epollfd,EPOLL_CTL_ADD,timerfd,&ev);

    const int maxEvents = 1;  //也可以设置为1
    struct epoll_event events[maxEvents];

    while(1){
        int nfd = epoll_wait(epollfd,events,maxEvents,-1);
        if(nfd>0){
            for(int i=0;i<maxEvents;i++){
                if(events[i].data.fd == timerfd){
                    uint64_t exp = 0;
                    int ret = read(timerfd,&exp,sizeof(uint64_t));  //为什么会有这儿块?????,如果不把数据读取出来,就不会10分钟采集一次,会毫秒级别任务,跟我们想象的不一致
                    if(ret != sizeof(uint64_t)){
                        log_printfln(LOG_INFO,"read histroy_data timerfd");
                        return -1;
                    }
                    collect_rtu_data();   // 除第一次1s外,每5s打印一次
                }
            }
        }
    }
    close(epollfd); //关闭epllfd
    close(timerfd); //关闭timerfd
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值