ZBLOG

Linux 中使用 POSIX 定时器

在 Linux 中使用 POSIX 定时器,可以通过 timer_createtimer_settimesignal 等系统调用来实现。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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=7318

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?