c语言,如何创建一个可以触发回调函数的循环定时器
时间: 2024-09-26 09:08:34 浏览: 55
在C语言中,要创建一个可以触发回调函数的循环定时器,通常需要利用POSIX线程库中的`timer_create`和`timer_settime`函数,以及信号量、互斥锁等机制来协调。这里是一个简单的例子:
```c
#include <stdio.h>
#include <sys/timerfd.h>
#include <pthread.h>
// 定义回调函数,假设这个函数接收一个用户数据参数
typedef void (*callback_func)(void* data);
void callback(void* arg) {
callback_func func = (callback_func)arg;
func(arg); // 调用回调函数
}
int main() {
int timer_fd;
struct itimerspec its;
callback_func my_callback = &callback; // 用户提供的回调函数
void* user_data = "Some Data"; // 用户数据
// 创建定时器文件描述符
if ((timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK)) == -1) {
perror("Failed to create timer");
return 1;
}
// 设置定时器属性
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 500 * 1000; // 每隔500毫秒
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 0;
// 将回调函数绑定到定时器
pthread_t timer_thread;
if (pthread_create(&timer_thread, NULL, &callback, (void*)&my_callback) != 0) {
perror("Failed to create thread");
close(timer_fd);
return 1;
}
// 启动定时器
if (ioctl(timer_fd, TIOCSETTIME, &its) == -1) {
perror("Failed to set time");
pthread_cancel(timer_thread);
close(timer_fd);
return 1;
}
while (true) {
// 这里是你的主循环,在这里检查定时器事件并处理回调
if (read(timer_fd, &its, sizeof(its)) > 0) {
if (its.it_value.tv_sec != its.it_interval.tv_sec) { // 只有在首次到期时才会收到此信息
your_main_logic(user_data); // 执行你的业务逻辑
}
}
nanosleep(&its.it_interval, NULL);
}
// 清理资源
pthread_cancel(timer_thread);
close(timer_fd);
return 0;
}
```
在这个例子中,当你希望停止定时器时,你可以直接中断定时器线程(`pthread_cancel`)。需要注意的是,这只是一个基础示例,并未处理错误和异常情况。
阅读全文