当前位置: 首页 > article >正文

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

(目录)

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

时间的计量

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

计算机中的计时方式:

51单片机:晶振

嵌入式系统:定时器

PC:定时器

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

Linux系统中的时间管理

定时器 + 实时时钟

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

C语言获取当前时间

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

时间格式的转化

#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` 中
    2. 线程安全,因为每个线程使用独立的内存。

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

将时间转化为字符串

 

#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

http://www.lryc.cn/news/2396270.html

相关文章:

  • Ubuntu 安装 Miniconda 及配置国内镜像源完整指南
  • 性能优化 - 理论篇:常见指标及切入点
  • 青少年编程与数学 02-020 C#程序设计基础 08课题、字符和字符串
  • 【论文阅读 | PR 2024 |ICAFusion:迭代交叉注意力引导的多光谱目标检测特征融合】
  • Spring Security加密模块深度解析
  • 华为OD机试真题——模拟消息队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • MySql(十三)
  • iOS —— UI 初探
  • day23-计算机网络-1
  • C语言基础(09)【数组的概念 与一维数组】
  • 【JavaScript】Ajax 侠客行:axios 轻功穿梭服务器间
  • Django数据库连接报错 django.db.utils.NotSupportedError: MySQL 8 or later is required
  • 2025年- H57-Lc165--994.腐烂的橘子(图论,广搜)--Java版
  • 2024 CKA模拟系统制作 | Step-By-Step | 16、题目搭建-sidecar 代理容器日志
  • (9)-Fiddler抓包-Fiddler如何设置捕获Https会话
  • Vue-Router 基础使用
  • 【案例分享】蓝牙红外线影音遥控键盘:瑞昱RTL8752CJF
  • 利用SQL批量修改Nacos配置
  • 网络协议的原理及应用层
  • Express教程【003】:Express获取查询参数
  • Android开发常用Kotlin高级语法
  • 输入ifconfig,发现ens33不见了,无法连接至虚拟机
  • Android Stdio 编译 文件生成,以及Gradle
  • 前端面试准备-4
  • AI赋能金融风控:基于机器学习的智能欺诈检测系统实战教程
  • Java虚拟机内存区域划分
  • 如何下载python的第三方类库
  • Redis击穿,穿透和雪崩详解以及解决方案
  • 网络渗透基础:信息收集
  • [SAP] 如何查询当前屏幕的Tcode?