在 Linux 中使用 POSIX 定时器,可以通过 timer_create
、timer_settime
和 signal
等系统调用来实现。POSIX 定时器允许我们设置一个定时器,当定时器到期时,它会发送信号或执行回调函数。
下面是一个简单的示例,演示了如何使用 POSIX 定时器:
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
// 定时器到期后要执行的处理函数
void timer_handler(int signum) {
printf("Timer expired!\n");
}
int main() {
struct sigaction sa;
struct itimerspec its;
timer_t timerid;
// 设置信号处理程序
sa.sa_handler = &timer_handler; // 指定处理函数
sigemptyset(&sa.sa_mask); // 清空信号集
sa.sa_flags = 0; // 不设置特殊标志
sigaction(SIGALRM, &sa, NULL); // 注册 SIGALRM 信号的处理程序
// 创建一个新的计时器
if (timer_create(CLOCK_REALTIME, NULL, &timerid) == -1) {
perror("timer_create");
exit(EXIT_FAILURE);
}
// 设置计时器的初始值和间隔(可重复)
its.it_value.tv_sec = 5; // 初始延迟时间为5秒
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = 2; // 每2秒触发一次
its.it_interval.tv_nsec = 0;
// 启动定时器
if (timer_settime(timerid, 0, &its, NULL) == -1) {
perror("timer_settime");
exit(EXIT_FAILURE);
}
printf("Timer started! Waiting for expiration...\n");
// 主线程等待信号到达,防止程序立即退出
while(1) {
pause(); // 暂停进程,等待信号到达(SIGALRM)
// 如果需要,可以在这里做其他事情。
printf("Main loop running...\n");
sleep(1); // 为了避免打印过快,这里加个睡眠。
if (/* 某个条件 */) {
break; // 根据需要添加退出条件以结束主循环。
}
}
return EXIT_SUCCESS;
}
编译和运行
可以使用 gcc
编译上述代码并运行:
gcc -o posix_timer posix_timer.c -lrt
./posix_timer
注意事项
- 创建和管理:每次创建定时器后,你都应该在不再需要它的时候销毁它,例如使用
timer_delete()
。 - 安全性:确保你注册的信号处理程序是异步安全的,以免造成竞态条件或其他不可预知的问题。
- 精度:
CLOCK_REALTIME
是基于实际时间的,如果你希望基于系统启动时间,可以考虑使用CLOCK_MONOTONIC
。
这个基本示例展示了如何使用 POSIX 定时器,在特定情况下激活并响应事件。你可以根据具体需求对其进行扩展和修改。
内容由零声教学AI助手提供,问题来源于学员提问