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
}

相关推荐

  1. php实现定时任务

    2023-12-17 03:20:02       52 阅读
  2. SpringBoot 实现定时任务

    2023-12-17 03:20:02       59 阅读
  3. SpringBoot实战定时任务

    2023-12-17 03:20:02       26 阅读
  4. epoll timer实现定时任务

    2023-12-17 03:20:02       46 阅读
  5. Spring Boot 定时任务实现

    2023-12-17 03:20:02       61 阅读
  6. 使用SpringBoot实现定时任务

    2023-12-17 03:20:02       44 阅读
  7. Spring Boot 实现定时任务

    2023-12-17 03:20:02       41 阅读
  8. C#实现定时执行任务

    2023-12-17 03:20:02       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-17 03:20:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-17 03:20:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-17 03:20:02       82 阅读
  4. Python语言-面向对象

    2023-12-17 03:20:02       91 阅读

热门阅读

  1. 【C++ 语法】__VA_ARGS__ 可变参数宏

    2023-12-17 03:20:02       51 阅读
  2. 记录 | ubuntu安装jdk1.6

    2023-12-17 03:20:02       59 阅读
  3. 前端深浅拷贝各有哪些方法,优缺点

    2023-12-17 03:20:02       59 阅读
  4. 二维数组——特征匹配(c++)

    2023-12-17 03:20:02       56 阅读
  5. 最流行的视频创作者

    2023-12-17 03:20:02       55 阅读
  6. 第12课 SQL入门之联结表

    2023-12-17 03:20:02       58 阅读
  7. Elasticsearch 8.9 search命令执行查询源码

    2023-12-17 03:20:02       49 阅读