利用linux的timerfd_create实现计时器示例分享


当然,我可以为你提供一个使用`timerfd_create`在Linux下实现简单计时器的示例代码。`timerfd_create`函数创建了一个定时器,该定时器在指定的时间间隔到期时,会在一个文件描述符上生成一个信号,可以通过`read`系统调用来读取这些信号。

以下是一个简单的示例,展示如何使用`timerfd_create`创建一个每秒触发一次的计时器:


#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/timerfd.h>
#include <stdint.h>
#include <time.h>

int main() {
    int timerfd;
    struct itimerspec its;
    uint64_t exp;

    // 创建一个计时器文件描述符
    timerfd = timerfd_create(CLOCK_REALTIME, 0);
    if (timerfd == -1) {
        perror("timerfd_create");
        exit(EXIT_FAILURE);
    }

    // 设置定时器间隔为1秒,无初始超时
    memset(&its, 0, sizeof(its));
    its.it_value.tv_sec = 0;
    its.it_value.tv_nsec = 0;
    its.it_interval.tv_sec = 1;
    its.it_interval.tv_nsec = 0;

    // 启动定时器
    if (timerfd_settime(timerfd, 0, &its, NULL) == -1) {
        perror("timerfd_settime");
        exit(EXIT_FAILURE);
    }

    printf("Timer started. Press CTRL+C to stop.\n");

    // 读取定时器到期通知
    while (1) {
        ssize_t s = read(timerfd, &exp, sizeof(exp));
        if (s != sizeof(exp)) {
            if (s == -1) perror("read");
            else fprintf(stderr, "read: unexpected number of bytes: %zd\n", s);
            break;
        }

        // 这里可以处理定时器到期的逻辑,例如打印消息
        printf("Timer expired (%ju) times\n", (uintmax_t)exp);
    }

    close(timerfd);
    return 0;
}

### 代码说明:

1. **创建计时器**:使用`timerfd_create`函数创建一个计时器文件描述符,这里我们使用`CLOCK_REALTIME`作为时钟源。

2. **设置计时器**:通过`timerfd_settime`函数设置定时器的初始超时时间和间隔时间。在这个例子中,我们设置初始超时为0(立即开始计时),间隔时间为1秒。

3. **读取到期通知**:通过在一个无限循环中调用`read`函数来读取定时器到期时生成的通知。每当定时器到期时,`read`函数会返回到期次数(虽然在这个简单例子中我们并未完全利用这个信息)。

注意:为了编译此代码,你需要有GCC或类似的C编译器,并且你的系统需要支持`timerfd_create`。在编译时,可能需要链接实时库(但在这个例子中,由于我们只使用了标准POSIX函数,所以通常不需要)。编译命令可能类似于`gcc -o timer_example timer_example.c`。