Linux 时间系统调用

news2024/12/26 9:21:21

UNIX及LinuxQ的时间系统是由「新纪元时间」Epoch开始计算起。Epoch是指定为1970
年1月1日凌晨零点零分零秒,格林威治时间。目前大部份的UNX系统都是用32位来记录时间,正值
表示为1970以后,负值则表示1970年以前。

对于当前时间到Epoch 我们用两种类型来描述 time_ttimeval


time_t  // 实际上就是uint32_t
struct timeval
{
  __time_t tv_sec;		/* Seconds.  */
  __suseconds_t tv_usec;	/* Microseconds.  */
};

这两个数据结构唯一的区别 就是timeval 的精度更高,精度达到了微妙

接下来我们要了解如何得到这两个类型:

time()

#include<time.h>
time_t time(time_t *tloc);

参数:

  • tloc: 当这个参数不为空的时候 ,距离Epoch 的秒数 会存在tloc所指向的内存中

返回值:
返回的是 距离Epoch 的秒数

从上面的我们发现:

  time_t t1;
  time(&t1);

  time_t t2;
  t2 = time(nullptr);

t1 和 t2 得到的结果是一样的

gettimeofday

#include<sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);

参数:

  • *tv: 输入输出型参数,返回现在到Epoch 有多少秒+多少微妙
  • tz:已经被废弃,直接NULL完事

返回值:
0 代表成功,-1 代表错误,errno 会被设置


现在我们已经知道了如何获取时间,但是现在又有一个问题,存储的秒数 虽然精确但是不是很易读,如何让这些时间变得易读就要用到接下来的系统调用。

在linux 中我们使用下面的数据结构来表示 一个易读的时间

struct tm
{
  int tm_sec;			/* Seconds.	[0-60] (1 leap second) */
  int tm_min;			/* Minutes.	[0-59] */
  int tm_hour;			/* Hours.	[0-23] */
  int tm_mday;			/* Day.		[1-31] */
  int tm_mon;			/* Month.	[0-11] */
  int tm_year;			/* Year	- 1900.  */
  int tm_wday;			/* Day of week.	[0-6] */
  int tm_yday;			/* Days in year.[0-365]	*/
  int tm_isdst;			/* DST.		[-1/0/1]*/

# ifdef	__USE_MISC
  long int tm_gmtoff;		/* Seconds east of UTC.  */
  const char *tm_zone;		/* Timezone abbreviation.  */
# else
  long int __tm_gmtoff;		/* Seconds east of UTC.  */
  const char *__tm_zone;	/* Timezone abbreviation.  */
# endif
};

gmtime

struct tm *gmtime(const time_t *timep);   // 线程不安全
struct tm *gmtime_r(const time_t *timep, struct tm *result);  // 线程安全的版本

参数:

  • timep:距离Epoch 的秒数
  • result:输入输出型参数

gmtime_r 输出的结构从输入参数中得到,而不是函数的返回值中得到!gmtime 不是线程安全的原因是把结果存在了静态变量中,导致多线程的时候不可重入!

注意这里的 gmt 和 UTC (世界协调时) 是一样的

localtime

struct tm *localtime(const time_t *timep);
struct tm *localtime_r(const time_t *timep, struct tm *result);

参数:

  • timep:距离Epoch 的秒数
  • result:输入输出型参数

localtime_r输出的结构从输入参数中得到,而不是函数的返回值中得到!localtime 不是线程安全的原因是把结果存在了静态变量中,导致多线程的时候不可重入!

下面来介绍一下 gmt 时间 和 本地时间 的区别:
众所周知不同国家都是有时差的,那么比方说北京时间是如何计算出来的呢? 首先UTC(世界协调时) 是一个基准,在这个基准上我们根据经纬度 划分出不同的时区,如果我们想得到本地时间 只要用标准时间加上该地区所在时区的偏移量。
举一个简单的例子: 北京时间在东八区时区,意味着北京时间比基准时间快8个小时(偏移量),而这个标准时间就是gmtime 函数得到的时间 而 本地时间(北京时间) 就是localtime得到的时间

我们可以做一个小实验

 struct timeval t3;
  gettimeofday(&t3, NULL);

  struct tm tm1;
  struct tm tm2;
  gmtime_r(&t1, &tm1);

  localtime_r(&t1, &tm2);
  cout << tm1.tm_year << " " << tm1.tm_mon << " " << tm1.tm_mday << " "
       << tm1.tm_hour << endl;
  cout << tm2.tm_year << " " << tm2.tm_mon << " " << tm2.tm_mday << " "
       << tm2.tm_hour << endl;

我们在执行之前先看一下时间
image.png
执行结果如下:
image.png
我们发现 正如所验证的一样,localtimegmtime快了八个小时

strftime

按照输入的格式,输出时间

 size_t strftime (char *__restrict __s, size_t __maxsize,
			const char *__restrict __format,
			const struct tm *__restrict __tp)

参数:

  • __s:输出字符串的指针
  • __maxsize:输出字符串的大小
  • __format:输出到输出字符串的时间的格式 详情见:man 2 strftime
  • __tp:上面获取的时间结构体

输出:
输出到__s字符串中 的字符的数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525151.html

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

相关文章

刷题日记——干碎那个BFS!(含国科大机试2021)

例题小引——迷宫问题 问题描述: 迷宫由n行m列的单元格组成(n&#xff0c;m都小于等于50&#xff09;&#xff0c;每个单元格要么是空地&#xff0c;要么是障碍物。 现请你找到一条从起点到终点的最短路径长度。 分析——&#xff08;迷宫问题BFS解法&#xff09; 使用BFS…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:GridRow)

栅格布局可以为布局提供规律性的结构&#xff0c;解决多尺寸多设备的动态布局问题&#xff0c;保证不同设备上各个模块的布局一致性。 栅格容器组件&#xff0c;仅可以和栅格子组件(GridCol)在栅格布局场景中使用。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本…

实战!wsl 与主机网络通信,在 wsl 中搭建服务器。学了计算机网络,但只能刷刷面试题?那也太无聊了!这篇文章可以让你检测你的计网知识!

前言&#xff08;碎碎念&#xff09;&#xff1a;每次发布文章时&#xff0c;我都是一个纠结的过程。因为我给自己写笔记时&#xff0c;只需要记录自己不清晰或者易忘的知识点就可以了&#xff0c;但一旦想要作为文章发布&#xff0c;那么我就得考虑到很多人是纯新手&#xff0…

1TGE120011R1111变频器全国发货质保一年

1TGE120011R1111 ABB ABB的1TGE120011R1111是一个属于其TGE系列的小型断路器&#xff08;也称为微型断路器或MCB&#xff09;。这个系列的断路器主要用于低压配电系统&#xff0c;为电路提供过载和短路保护。以下是这款断路器的一些特点&#xff1a; 紧凑设计&#xff1a;TGE系…

【数据库】数据库基本知识

1.数据库的四个基本概念 1.1 数据&#xff1a;描述事务的符号记录 1.2 数据库&#xff1a;概括的说&#xff0c;数据库数据具有永久存储、有组织的、可共享的大量数据的集合&#xff0c;数据库中的数据按一定的数据模型组织、描述和储存&#xff0c;具有较小的冗余度、较高的…

2、鸿蒙学习-申请调试证书和调试Profile文件

申请发布证书 发布证书由AGC颁发的、为HarmonyOS应用配置签名信息的数字证书&#xff0c;可保障软件代码完整性和发布者身份真实性。证书格式为.cer&#xff0c;包含公钥、证书指纹等信息。 说明 请确保您的开发者帐号已实名认证。每个帐号最多申请1个发布证书。 1、登录AppGa…

AI美图设计室试用,可以生成PPT,以及模特试衣

文章目录 美图设计室试用 美图设计室试用 美图设计室是美图秀秀的公司推出的AI图像处理工具&#xff0c;其功能涵盖图片编辑、抠图、海报设计、文生图等常用的AI功能。尽管很多功能需要开通会员使用&#xff0c;但一些免费功能的表现也还不错&#xff0c;值得一用。 美图设计…

【解读】NIST网络安全框架CSF 2.0

2014年&#xff0c;NIST&#xff08;美国国家标准与技术研究所&#xff0c;类似于中国的工信部&#xff09;首次发布了网络安全框架CSF&#xff08;Cybersecurity Framework)&#xff0c;十年后&#xff0c;在2024年2月26日发布了重大更新&#xff08;CSF 2.0&#xff09;&…

【蓝屏分析】WHEA_UNCORRECTABLE_ERROR 问题分析与解决

背景信息 电脑名字电脑类型厂商使用时间magicbook14 2020款 R5 4500U笔记本电脑荣耀HONOR3年9个月 内存CPUGPU硬盘焊死在主板上焊死在主板上集显PCIe 4.0 NVMe M.2 固态 软硬件错误源确定 电脑莫名频繁随机蓝屏&#xff0c;由于在软件环境上无迹可寻推测是硬件问题 蓝屏画面…

Pretrain-finetune、Prompting、Instruct-tuning训练方法的区别

来自&#xff1a;【多模态】28、LLaVA 第一版 | Visual Instruction Tuning 多模态模型的指令微调_多模态指令跟随数据-CSDN博客 几种模型训练方法的区别&#xff1a; 1、Pretrain-finetune&#xff1a;先在大量数据集上做预训练&#xff0c;然后针对某个子任务做 finetune 2…

Python图像处理指南:PIL与OpenCV的比较【第136篇—PIL】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python图像处理指南&#xff1a;PIL与OpenCV的比较 图像处理在计算机视觉和图像识别等领域…

实现悲观协议,除了锁还能咋办?

相对乐观和局部悲观是一体两面的关系&#xff0c;识别它的要点就在于是否有全局有效性验证&#xff0c;这也和分布式数据库的架构特点息息相关。但是关于悲观协议&#xff0c;还有很多内容没有提及&#xff0c;下面我们就来填补这一大块空白。 悲观协议的分类 要先跳出来&…

Word使用通配符替换

1.通配符替换 使用&#xff08;[通配替换文本]&#xff09; M-MM12-00([0123456789])-0([0123456789])([0123456789])-0([0123456789])([0123456789]) 2.根据自定义格式替换 根据格式、样式替换&#xff0c;如只替换标题的内容&#xff0c;不替换征文

ASP.NET 服务器控件

目录 一、使用的软件 1、下载 2、新建文件&#xff08;写一个简单的web网页&#xff09; 二、相关知识点 1、Web窗体网页的组件 &#xff08;1&#xff09;可视化组件 &#xff08;2&#xff09;用户接口逻辑 2、Web Form网页的代码模型 &#xff08;1&#xff09;单文件…

STM32的USART能否支持9位数据格式话题

1、问题描述 STM32L051 这款单片机。平常的 USART 串口传输是 8 位数据&#xff0c;但是他的项目需要用串口传输 9 位数据。当设置为 8 位数据时&#xff0c;串口响应中断正常。但是&#xff0c;当设置为 9 位数据时&#xff0c;串口就不产生中断了。USART2 的 ISR 寄存器 RXN…

前端基础篇-深入了解 JavaScript(一)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 JavaScript 概述 2.0 JS - 引入方式 3.0 JS - 基础语法 4.0 JS - 数据类型 5.0 JS - 函数 6.0 JS - Array 数组 7.0 JS - String 字符串 1.0 JavaScript 概述…

Java推荐算法——特征加权推荐算法(以申请学校为例)

加权推荐算法 文章目录 加权推荐算法1.推荐算法的简单介绍2.加权推荐算法详细介绍3.代码实现4.总结 1.推荐算法的简单介绍 众所周知&#xff0c;推荐算法有很多种&#xff0c;例如&#xff1a; 1.加权推荐&#xff1a;分为简单的特征加权&#xff0c;以及复杂的混合加权。主要…

Qt文件读写

做一个简单的文件读写&#xff0c;我们把一个结构体内的数据写入到二进制文件中&#xff0c;并重新读取解析。代码结构如下&#xff1a; 项目名称随便起就好了。main.cpp是主函数&#xff1b;DataHandler实现文件的写与读&#xff0c;还要模拟过程&#xff1b;Definition.h放置…

蚁群算法实现 - 全局路径规划算法

参考博客&#xff1a; &#xff08;1&#xff09;【人工智能】蚁群算法(密恐勿入) &#xff08;2&#xff09;计算智能——蚁群算法 &#xff08;3&#xff09;蚁群算法(实例帮助理解) &#xff08;4&#xff09;【数之道 04】解决最优路径问题的妙招-蚁群ACO算法 &#xff08;…

51单片机—DS18B20温度传感器

目录 一.元件介绍及原理 二&#xff0c;应用&#xff1a;DS18B20读取温度 一.元件介绍及原理 1.元件 2.内部介绍 本次元件使用的是单总线 以下为单总线的介绍 时序结构 操作流程 本次需要使用的是SKIP ROM 跳过&#xff0c; CONVERT T温度变化&#xff0c;READ SCRATCHPAD…