一文详谈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.pswp.cn/diannao/85124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用FastAPI+Sqlalchemy从一个数据库向另一个数据库更新数据(sql语句版)

from sqlalchemy import create_engine, text from sqlalchemy.orm import sessionmaker # 配置数据库连接&#xff08;示例为PostgreSQL->MySQL&#xff09; SRC_DB_URL postgresql://user:passsource_host:5432/source_db DST_DB_URL mysqlpymysql://user:passdest_hos…

基于python脚本进行Maxwell自动化仿真

本文为博主进行Maxwell自动化研究过程的学习记录&#xff0c;同时对Maxwell自动化脚本&#xff08;pythonIron&#xff09;实现方法进行分享。 文章目录 脚本使用方法脚本录制与查看常用脚本代码通用开头定义项目调整设计变量软件内对应位置脚本 设置求解器软件内对应位置脚本…

pikachu通关教程-RCE

目录 RCE(remote command/code execute)概述: exec "ping" 管道符 乱码问题 RCE(remote command/code execute)概述: RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统 分为远程代码和远程命令两种.当…

JavaScript性能优化全景指南

JavaScript性能优化全景指南 Ⅰ. 加载性能优化 1.1 代码分割与懒加载 动态导入(ES2020) javascript // 路由级代码分割 const ProductPage () > import(/* webpackChunkName: "product" */ ./ProductPage.vue); // 交互驱动加载 document.querySelector(#char…

BaseTypeHandler用法-笔记

1.BaseTypeHandler简介 org.apache.ibatis.type.BaseTypeHandler 是 MyBatis 提供的一个抽象类&#xff0c;通过继承该类并实现关键方法&#xff0c;可用于实现 Java 类型 与 JDBC 类型 之间的双向转换。当数据库字段类型与 Java 对象属性类型不一致时&#xff08;如&#xff…

t015-预报名管理系统设计与实现 【含源码!!!】

项目演示地址 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装预报名管理系统软件来发挥其高效地信息处理的…

Day12 - 计算机网络 - HTTP

HTTP常用状态码及含义&#xff1f; 301和302区别&#xff1f; 301&#xff1a;永久性移动&#xff0c;请求的资源已被永久移动到新位置。服务器返回此响应时&#xff0c;会返回新的资源地址。302&#xff1a;临时性性移动&#xff0c;服务器从另外的地址响应资源&#xff0c;但…

【python深度学习】Day 40 训练和测试的规范写法

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练代码…

亡羊补牢与持续改进 - SRE 的安全日志、审计与事件响应

亡羊补牢与持续改进 - SRE 的安全日志、审计与事件响应 如果说我们之前讨论的安全措施(如 IAM、网络策略、密钥管理、漏洞补丁)是为我们的“数字城堡”修筑坚固的城墙、设置精密的门锁、定期检查和修补潜在的裂缝,那么安全日志就像是遍布城堡内外的监控摄像头和出入登记簿,…

CppCon 2014 学习第2天:Using Web Services in C++

概述 这是一个会议或演讲的概述内容&#xff0c;主要介绍一个关于C Rest SDK的分享&#xff0c;翻译和理解如下&#xff1a; 翻译 概述 先介绍什么是典型的Web服务结构和它的特征讲讲调用这些Web服务的几种方式重点介绍自己团队开发的一个C库&#xff08;C Rest SDK&#xf…

【OpenHarmony】【交叉编译】使用gn在Linux编译3568a上运行的可执行程序

linux下编译arm64可执行程序 一.gn ninja安装二.交叉编译工具链安装1.arm交叉编译工具2.安装arm64编译器 三. gn文件添加arm及arm64工具链四.编译验证 本文以gn nijia安装中demo为例&#xff0c;将其编译为在arm64(rk_3568_a开发板)环境下可运行的程序 一.gn ninja安装 安装g…

【开发心得】AstrBot对接飞书失败的问题探究

飞书与AstrBot的集成使用中,偶尔出现连接不稳定的现象。尽管不影响核心功能,但为深入探究技术细节并推动后续优化,需系统性记录该问题。先从底层通信机制入手,分析连接建立的逻辑与数据交互流程。基于实际现象,明确问题发生的具体场景和表现特征,进而梳理潜在影响因素,为…

Spring Boot 3.5.0中文文档上线

Spring Boot 3.5.0 中文文档翻译完成&#xff0c;需要的可收藏 传送门&#xff1a;Spring Boot 3.5.0 中文文档

7.atlas安装

1.服务器规划 软件版本参考&#xff1a; https://cloud.google.com/dataproc/docs/concepts/versioning/dataproc-release-2.2?hlzh-cn 由于hive3.1.3不完全支持jdk8,所以将hive的版本调整成4.0.1。这个版本没有验证过&#xff0c;需要读者自己抉择。 所有的软件都安装再/op…

c# 获取电脑 分辨率 及 DPI 设置

using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices;/// <summary> /// 这个可以 /// </summary> class Program {static void Main(){//设置DPI感知try{SetProcessDpiAwareness(…

LangChain表达式(LCEL)实操案例1

案例1&#xff1a;写一篇短文&#xff0c;然后对这篇短文进行打分 from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables import RunnableWithMessageHist…

OleDbParameter.Value 与 DataTable.Rows.Item.Value 的性能对比

OleDbParameter.Value 与 DataTable.Rows.Item.Value 的性能对比 您提到的两种赋值操作属于不同场景&#xff0c;它们的性能和稳定性取决于具体使用方式。下面从几个维度进行分析&#xff1a; 1. 操作本质对比 &#xff08;1&#xff09;OleDbParameter.Value 用途&#xf…

【Opencv+Yolo】Day2_图像处理

目录 一、图像梯度计算 图像梯度-sobal算子&#xff1a; Scharr&#xff1a;权重变化更大&#xff08;线条更加丰富&#xff0c;比Sobel更加细致捕捉更多梯度信息&#xff09; Laplacian算子&#xff1a;对噪音点敏感&#xff08;可以和其他一起结合使用&#xff09; 二、边…

STM32通过rt_hw_hard_fault_exception中的LR寄存器追溯程序问题​

1. 问题现象 程序运行导致rt_hw_hard_fault_exception 如图 显示错误相关代码 struct exception_stack_frame {uint32_t r0;uint32_t r1;uint32_t r2;uint32_t r3;uint32_t r12; uint32_t lr; // 链接寄存器 (LR)uint32_t pc; // 程序计数器 (PC)uint32_t psr; // 程序状态…

Mac安装配置InfluxDB,InfluxDB快速入门,Java集成InfluxDB

1. 与MySQL的比较 InfluxDBMySQL解释BucketDatabase数据库MeasurementTable表TagIndexed Column索引列FieldColumn普通列PointRow每行数据 2. 安装FluxDB brew update默认安装 2.x的版本 brew install influxdb查看influxdb版本 influxd version # InfluxDB 2.7.11 (git: …