timerfd_create
本身并不直接支持回调函数,因为它是一个系统调用,用于创建一个定时器文件描述符。要使用回调机制,通常结合 I/O 多路复用(如 select
、poll
或 epoll
)来处理定时器事件。
实现回调机制的示例
以下是一个示例程序,演示如何使用 timerfd_create
创建定时器,并在事件发生时执行相应的“回调”操作:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/timerfd.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h> // For O_NONBLOCK
#include <errno.h>
void timer_callback(uint64_t expirations) {
printf("Timer expired %llu times\n", (unsigned long long)expirations);
}
int main() {
// 创建定时器文件描述符
int tfd = timerfd_create(CLOCK_MONOTONIC, 0);
if (tfd == -1) {
perror("timerfd_create");
exit(EXIT_FAILURE);
}
// 设置定时器属性
struct itimerspec new_value;
new_value.it_value.tv_sec = 5; // 首次超时时间(秒)
new_value.it_value.tv_nsec = 0; // 首次超时时间(纳秒)
new_value.it_interval.tv_sec = 2; // 周期性超时时间(秒)
new_value.it_interval.tv_nsec = 0; // 周期性超时时间(纳秒)
// 启动定时器
if (timerfd_settime(tfd, 0, &new_value, NULL) == -1) {
perror("timerfd_settime");
exit(EXIT_FAILURE);
}
uint64_t expirations;
while (1) {
// 使用 read 阻塞等待事件发生
ssize_t s = read(tfd, &expirations, sizeof(expirations));
if (s != sizeof(expirations)) {
perror("read");
exit(EXIT_FAILURE);
}
// 调用回调函数
timer_callback(expirations);
// 可选:你可以添加一些逻辑,例如退出条件等。
}
close(tfd);
return 0;
}
程序说明
- 创建定时器: 使用
timerfd_create()
创建一个新的定时器。 - 设置定时器: 使用
timerfd_settime()
配置首次过期和周期性过期的时间。 - 读取计数: 在循环中使用
read()
阻塞等待计时器到期。 - 调用回调: 当计数发生变化后,调用自定义的回调函数
timer_callback()
来处理事件。
总结
虽然 timerfd_create
不直接支持回调,但通过结合文件描述符与 I/O 多路复用,你可以实现类似于异步事件处理的效果。这样,当计时器到达设定时间后,就会触发特定的处理逻辑。
内容由零声教学AI助手提供,问题来源于学员提问