一文详谈Linux中的时间管理和定时器编程

(目录)

先说一些在计算机中需要用到时间的地方:系统日志log、OS调度(时间片、定时器)等等~~

时间的计量

计时的方式发展:日晷、沙漏 -> 机械钟 -> 石英振荡器、晶振 -> 铯原子钟 -> 氢原子钟

计算机中的计时方式:

51单片机:晶振

嵌入式系统:定时器

PC:定时器

实时时钟:独立电源(CMOS电池、手机晶振)

Linux系统中的时间管理

定时器 + 实时时钟

计算机启动之后,Linux内核会先在实时时钟中读取时间,保存到内核中的全局变量xtime(墙上时间)中;jiffies:内核中的全局变量,系统启动以来的节拍数。

C语言获取当前时间

cpp 复制代码
typedef long time_t;
time_t t = time(NULL); // 获得当前时间,UTC时间,1979年1月1日0点开始,以秒为单位
stime(&t);             // 设置时间

时间格式的转化

cpp 复制代码
#include <stdio.h>
#include <time.h>
int main(void)
{
    time t t=time(NULL);
    printf("%ld\n",t);
    struct tm *p;
    p=localtime(&t);
    printf ("%d-%d-%d "p->tm year +1900,p->tm mon +1,p->tm mday);
    printf("%d:%d:%d\n",p->tm hour, p->tm_min, p->tm_sec);
    p = gmtime(&t);
    printf ("%d-%d-%d ",p->tm year +1900,p->tm mon +1,p->tm mday);
    printf("%d:%d:%d\n",p->tm hour,p->tm min,p->tm sec);
    return 0;
}

这里p指向的struct tm类型的变量在静态内存(库内部)。

安全替代方案

为解决线程安全和重入问题,Linux 提供了:

  1. localtime_r(可重入版本)
    1.

    复制代码
    struct tm result;
    localtime_r(&time_val, &result); // 结果存储到用户提供的 `result` 中
    1. 线程安全,因为每个线程使用独立的内存。

    2. 用户需自行管理存储位置(如栈或堆)。

将时间转化为字符串

cpp 复制代码
#include <stdio.h>
#include <time.h>
int main(void)
{
    time t t= time(NULL);
    printf("%ld\n",t);char *str = NULL;
    str =ctime(&t);printf("%s\n",str);
    struct tm *p;
    p = gmtime(&t);
    printf("%d-%d-%d ".,p->tm year + 1900,p->tm mon + 1,p->tm mday);
    printf("%d:%d:%d\n",p->tm hour, p->tm_min, p->tm_sec);
    str = asctime(p);printf("%s",str);
    return 0;
}

用户指定格式字符串

获得高精度时间

微秒

纳秒

Linux中的定时器

alarm

alarm(3) : 3秒之后,向该进程发送SIGALRM信号。

interval timer

设置的时间到达后,会重置;alarm只有一次。

POSIX timer

相关推荐
huangyuchi.8 分钟前
【Linux实战 】Linux 线程池的设计、实现与单例模式应用
linux·c++·单例模式·线程池·懒汉模式·项目·linux系统
Lenyiin35 分钟前
《 Linux 点滴漫谈: 三 》Linux 的骨架:文件系统与目录结构的完整图谱
linux·运维·服务器·lenyiin
ZLRRLZ1 小时前
【Linux操作系统】进程概念
linux·运维·服务器
做运维的阿瑞2 小时前
GPU即服务:Linux与云原生如何联手开启AI算力“自来水“时代
linux·人工智能·云原生
骄傲的心别枯萎2 小时前
项目1:FFMPEG推流器讲解(一):FFMPEG重要结构体讲解
linux·ffmpeg·音视频·视频编解码·rv1126
报错小能手3 小时前
linux学习笔记(16)进程间通信——管道
linux·笔记·学习
带土13 小时前
3. Ubuntu 14.04更换阿里云源,设置系统字体
linux·ubuntu
XUE-52113143 小时前
BGP实验-路由优选
linux·服务器·网络·网络协议
tt5555555555553 小时前
嵌入式开发面试八股文详解教程
linux·c++·驱动开发·面试
蛐蛐蛐3 小时前
Win11上VS Code免输密码连接Ubuntu的正确设置方法
linux·运维·ubuntu