Linux 定时器

文章目录

  • [alarm() 函数实现定时功能](#alarm() 函数实现定时功能)
  • [setitimer() 函数实现定时功能](#setitimer() 函数实现定时功能)

alarm() 函数实现定时功能

alarm()函数的签名如下:

csharp 复制代码
#include <unistd.h>
unsigned int alarm(unsigned int seconds);

参数1 是你想定时的秒数。

返回值是在你调用这个函数的时刻,上一次的 alarm() 所剩余的秒数。例如,你上一次调用了 alarm(10),7秒钟以后你再次调用了alarm(6),那么在 alarm(6) 时返回的值就是 3 。

alarm() 的定时是一次性的,若想实现循环定时功能,则需要手动在本次定时结束时再次启动 alarm() 定时

如代码实现中,第一次设定定时器后,经过3s后才调用sig_alarm_handler函数,因为是一次性的,所以在sig_alarm_handler函数中, int remaing = alarm(2);继续使用alarm函数

alarm() 在定时到时后会发出一个 SIGALRM 信号,所以还需要我们拦截这一信号才能接收到定时回调结果。

代码实现

csharp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>

static int counter;

void sig_alarm_handler(int);

time_t current_time;
struct tm *time_info;
char timeString[64]; // 用于存储格式化后的时间

void output_time()
{
    // 获取当前时间
    time(&current_time);
    // 将time_t类型的时间转换为tm结构
    time_info = localtime(&current_time);

    // 格式化时间输出为年-月-日 时:分:秒
    strftime(timeString, sizeof(timeString), "%Y-%m-%d %H:%M:%S", time_info);
    printf("当前时间: %s\n", timeString);
}

int main()
{

    printf("pid: %d\n", getpid());

    // sighandler_t *pre = signal(SIGALARM, sig_alarm_handler);
     //拦截定时器信号。
    __sighandler_t *pre = signal(SIGALRM, sig_alarm_handler);
    printf("signal() return ret address:%p,my sig_alm_handler:%p\n", pre, sig_alarm_handler);

    //设定定时器。
    int remaing = alarm(3);
    output_time();
    printf("alarm remaing:%d\n", remaing); // remaing 应该是0才对。
    counter = 0;

    while (1)
    {
        // usleep(500);
    }

    //主动关闭定时器。
    alarm(0);
    output_time();

    return 0;
}

void sig_alarm_handler(int sig_num)
{
    printf("%s,signal number:%d,couter:%d\n", __FUNCTION__, sig_num, counter);
    if (sig_num == SIGALRM)
    {
        counter++;
        int remaing = alarm(2);
        printf("re-alarm remaing:%d\n", remaing);
        output_time();
    }
}

setitimer() 函数实现定时功能

补充。。

相关推荐
如意.75918 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
Thera77718 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
罗超驿18 小时前
独立实现双向链表_LinkedList
java·数据结构·链表·linkedlist
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ19 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
努力也学不会java20 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
安当加密21 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
内卷焦虑人士21 小时前
Windows安装WSL2+Ubuntu 22.04
linux·windows·ubuntu
菜菜小狗的学习笔记1 天前
剑指Offer算法题(四)链表
数据结构·算法·链表
We་ct1 天前
LeetCode 148. 排序链表:归并排序详解
前端·数据结构·算法·leetcode·链表·typescript·排序算法
dddddppppp1231 天前
qemu模拟的一个内核驱动 io口中断
linux