Linux定时器timerfd用法

一、timerfd系列的定时函数

#include <sys/timerfd.h>
int timerfd_create(int clockid, int flags);
int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);
int timerfd_gettime(int fd, struct itimerspec *curr_value);

① timerfd_create函数创建定时器对象,这个定时器对象与返回值timerfd进行绑定。第一个参数clockid如果指定为 CLOCK_REALTIME 时表示定时器为实时系统时钟,如果指定为CLOCK_MONOTONIC 表示一个相对单调递增的时钟;第二个参数flags可以指定为TFD_NONBLOCK或者 TFD_CLOEXEC

② timerfd_settime函数可以设置定时器对象,第一个参数就是timerfd_create函数的返回值,第二个参数指定为0时表示启动相对定时器(此时第三个参数new_value.it_value就要指定为相对时间,假如当前时间为8:00,希望定时器在8:10响的话就设置new_value.it_value为10分钟),当指定为TFD_TIMER_ABSTIME表示绝对定时器(第三个参数new_value.it_value要指定为绝对时间,希望定时器在8:10响的话就指定new_value.it_value为8:10

③ timerfd_gettime函数的第1个参数是timerfd_create函数的返回值,第二个参数curr_value.it_value表示当前时间到第一次触发剩余的时间。


1、 timerfd_create, timerfd_settime 和 read函数举例:首先设置单次触发定时器,就是设置 struct itimerspec new_value 结构体的成员new_value.it_interval.tv_sec 和 new_value.it_interval.tv_nsec 的值为0

启动相对定时器,单次触发时钟,点击展开代码
#define _POSIX_C_SOURCE 199309L

#include <sys/timerfd.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>

#define handle_error(msg) \
       do { perror(msg); exit(EXIT_FAILURE); } while (0)

int main(void)
{
    uint64_t exp = 0;
    int timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); 
    if (timerfd == -1)
    {
        handle_error("timerfd_create");
    }

    struct itimerspec new_value = {};
    new_value.it_value.tv_sec  = 10; // 2s
    new_value.it_value.tv_nsec = 0;
    
    new_value.it_interval.tv_sec  = 0; // one shot
    new_value.it_interval.tv_nsec = 0;

    /*启动timerfd绑定的定时器,0表示启动相对定时器,时间=当前时间+new_value.it_value,NULL表示旧的定时值*/
    if (timerfd_settime(timerfd, 0, &new_value, NULL) == -1) 
    {
        handle_error("timerfd_settime");
    }

    printf("timer started\n");

    while (1)
    {
        int ret = read(timerfd, &exp, sizeof(uint64_t));
        
        if (ret == sizeof(uint64_t)) // 
        {
            printf("ret: %d\n", ret);
            printf("expired times: %llu\n", exp);
            break;
        }
    }

    return 0;

}

2、 timerfd_create, timerfd_settime 和 read函数举例:首先设置单次触发定时器,就是设置 struct itimerspec new_value 结构体的成员new_value.it_interval.tv_sec = 5, new_value.it_interval.tv_nsec = 0,使得第一次触发后每隔5s再触发一次。

(37条消息) Linux下定时函数timerfd_xxx()的使用_爱就是恒久忍耐的博客-CSDN博客

(37条消息) struct timespec 和 struct timeval_思泽之思的博客-CSDN博客

Linux定时器timerfd用法 - 明明1109 - 博客园 (cnblogs.com)

posted @ 2023-04-12 16:18  轩邈、  阅读(276)  评论(0编辑  收藏  举报