一文详谈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

相关推荐
YuMiao12 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
chlk1231 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑1 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件1 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
深紫色的三北六号2 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash2 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行3 天前
Linux和window共享文件夹
linux
Sinclair3 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux