获取系统信息1——linux系统中的时间

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、关于时间的概念

1、GMT时间

GMT是格林尼治时间,即格林尼治地区的当地时间。用格林尼治的当地时间作为全球国际时间,用以描述全球性的事件的时间,方便大家记忆。选这个地区的原因,是因为它是天文学发源地。

2、UTC时间

GMT时间是以前使用的,近些年使用UTC时间;参考UTC和GMT时间 - 秋忆 - 博客园。

3、计算机中与时间有关的部件

点时间和段时间关系:段时间=点时间-点时间。

定时器(timer)定的时间就是段时间,实时时钟(RTC)是和点时间有关的一个器件。

二、linux系统中的时间

1、jiffies的引入

内核配置时定义了一个节拍时间,linux内核的调度系统工作时,以这个节拍时间为时间片。

jiffies是linux内核中的一个全局变量,它是(以内核的节拍时间为单位时间的)一个数值,通过此数值可以知道过了多少个节拍。

开机时,jiffies变量有一个基准值,然后内核每过一个节拍时间jiffies就会加1。

2、linux系统如何记录时间

(1)开机启动时,内核会读取RTC硬件(断电会继续运行,有电池),获取一个时间作为初始基准时间。

  • 这个基准时间对应一个jiffies值;

  • 这个基准时间换算成jiffies值的方法:用这个时间减去1970-01-01 00:00:00 +0000(UTC),然后把这个时间段换算成jiffies数值。

  • 这个jiffies值作为我们开机时的基准jiffies值存在;

  • 系统运行时,每个时钟节拍的末尾都会给jiffies这个全局变量加1,因此操作系统就使用jiffies这个全局变量记录当前的时间。

  • 当需要当前时间点时,就用jiffies这个时间点去计算;

  • 计算方法:先把当前的jiffies值对应的时间段算出来,然后加上1970-01-01 00:00:00 +0000(UTC)即可得到这个时间点。

(2)操作系统只在开机时读一次RTC

  • 整个系统运行过程中RTC是无作用的,RTC的真正作用是在OS的2次开机之间进行时间的保存。

(3)理解要点

  • jiffies这个变量记录的是段时间(即当前时间和1970-01-01 00:00:00 +0000(UTC)这个时间的差值);

  • 一个时间节拍的时间取决于操作系统的配置,现代linux系统一般是10ms或者1ms。

  • 这个时间其实就是调度时间,在内核中用HZ来记录和表示。如果HZ定义成1000,则时钟节拍就是1/HZ,也就是1ms。

3、linux中与时间相关的API

(1)常用的时间相关的API和C库函数有9个

  • time、ctime、localtime、gmtime、mktime、asctime、strftime、gettimeofday、settimeofday;

(2)time系统调用返回(当前时间距离1970-01-01 00:00:00 +0000(UTC)的)秒数

  • time内部用jiffies换算得到秒数;

  • 其他函数基本都是围绕着time来工作的;

(3)gmtime、localtime把time得到的秒数变成一个struct tm结构体表示的时间

  • gmtime得到的是国际时间,而localtime得到的是本地(运行localtime函数的程序所在的计算机所设置的时区对应的本地时间)时间;

  • mktime用来完成相反方向的转换(struct tm到time_t);

(4)如果想从struct tm出发,得到字符串格式的时间,可以用asctime或者strftime;如果想从time_t出发,得到字符串格式的时间,用ctime。

(5)gettimeofday返回的时间

  • 由struct timeval和struct timezone这两个结构体来共同表示的,其中timeval表示时间,而timezone表示时区;

  • settimeofday是用来设置当前的时间和时区的;

(6)总结

  • 不管使用哪个系统调用,最终得到的时间本质上都是一个时间(这个时间最终都是从kernel中记录的jiffies中计算得来的);

  • 不同的函数返回的时间的格式不同,精度不同。

三、时间相关API实战

1、time

  • time能得到一个当前时间距离标准起点时间1970-01-01 00:00:00 +0000(UTC)过去了多少秒

2、ctime

  • ctime可以从time_t出发得到一个容易观察的字符串格式的当前时间;

  • ctime好处是很简单好用,可以直接得到当前时间的字符串格式,直接打印来看。

  • 坏处是ctime的打印时间格式是固定的,没法按照我们的想法去变。

  • ctime函数得到的时间考虑了计算机中的本地时间的(计算机中的时区设置)。

3、gmtime和localtime

  • gmtime获取的时间中:年份是以1970为基准的差值,月份是0表示1月,小时数是以UTC时间的0时区为标准的小时数。

  • localtime和gmtime的唯一区别就是localtime以当前计算机中设置的时区为小时的时间基准,其余一样。实践证明我们的猜测是正确的。

4、mktime

  • 从OS中读取时间时用不到mktime的,这个mktime是用来向操作系统设置时间时用的。

5、asctime

  • asctime得到一个固定格式的字符串格式的当前时间,效果上和ctime一样的。

  • 区别是ctime从time_t出发,而asctime从struct tm出发。

6、strftime

  • asctime和ctime得到的时间字符串都是固定格式的,没法用户自定义格式;

  • 如果需要用户自定义时间的格式,则需要用strftime。

7、gettimeofday和settimeofday

  • 前面讲到的基于time函数的那个系列都是以秒为单位来获取时间的,没有比秒更精确的时间;

  • 有时候希望得到非常精确的时间(譬如以us为单位),只能通过gettimeofday来实现。

8、代码

#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sys/time.h>int main(void)
{time_t tNow = -1;struct tm tmNow;char buf[100];struct timeval tv = {0};struct timezone tz = {0};int ret = -1;// time//tNow = time(NULL);		// 返回值time(&tNow);				// 指针做输出型参数if (tNow < 0){perror("time");return -1;}printf("time: %ld.\n", tNow);// ctimeprintf("ctime: %s.\n", ctime(&tNow));//ctime可以从time_t出发得到一个容易观察的字符串格式的当前时间;
#if 0	// gmtime 和localtimememset(&tmNow, 0, sizeof(tmNow));gmtime_r(&tNow, &tmNow);printf("年%d月%d日%d时%d.\n", tmNow.tm_year,\tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);//可重入版本的,不用在子函数内部申请空间,//而是结构体在外部申请空间后,结构体作为传参传入//因此之前必须menset。//对比不可重入的,一般是在子函数内部为结构体申请空间。memset(&tmNow, 0, sizeof(tmNow));localtime_r(&tNow, &tmNow);printf("年%d月%d日%d时%d.\n", tmNow.tm_year, tmNow.tm_mon, \tmNow.tm_mday, tmNow.tm_hour);
#endif#if 0// asctimememset(&tmNow, 0, sizeof(tmNow));localtime_r(&tNow, &tmNow);printf("年%d月%d日%d时%d.\n", tmNow.tm_year, tmNow.tm_mon, \tmNow.tm_mday, tmNow.tm_hour);printf("asctime:%s.\n", asctime(&tmNow));
#endif#if 0// strftimememset(&tmNow, 0, sizeof(tmNow));localtime_r(&tNow, &tmNow);printf("年%d月%d日%d时%d.\n", tmNow.tm_year, tmNow.tm_mon, \tmNow.tm_mday, tmNow.tm_hour);memset(buf, 0, sizeof(buf));strftime(buf, sizeof(buf), "%Y * %m * %d, %H-%M-%S.", &tmNow);printf("时间为:[%s].\n", buf);
#endif// gettimeofdayret = gettimeofday(&tv, &tz);if (ret < 0){perror("gettimeofday");return -1;}printf("seconde: %ld.\n", tv.tv_sec);printf("timezone:%d.\n", tz.tz_minuteswest);return 0;
}

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

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

相关文章

判断一个字符串是否为回文-链队(新建,进队,出队),链栈(新建,进栈,出栈)...

回文&#xff1a;字符对称排列的字符串&#xff0c;例如ABCBA 思路&#xff1a;根据队&#xff1a;先进先出和栈: 先进后出的原则&#xff0c;进行比较出队和出栈的字符是否相等。如果相等&#xff0c;则为回文。 创建控制台应用程序。 1 #region 字符节点类 2 …

句法依存分析_复旦大学邱锡鹏教授:词法、句法分析研究进展综述

本文为第十六届自然语言处理青年学者研讨会 YSSNLP2019 报告《词法、句法分析研究进展综述》的简要文字整理&#xff0c;本报告主要回顾词法、句法领域的最新研究进展。 关于报告人&#xff1a;邱锡鹏&#xff0c;复旦大学计算机科学技术学院副教授&#xff0c;博士生导师。于复…

获取系统信息3——proc文件系统介绍和使用

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、proc文件系统介绍 1、操作系统级别的调试一般很困难 简单的程序可以单步调试&#xff1b;复杂一点的程序可以printf、cout等打印信息调试&#xff08;即输出信息到控制台&#xff09;&#xff0…

阻止函数源码在控制台输出

这是一个很贱的技能&#xff0c;我在谷歌控制台源码里看到的。相信大家都知道&#xff0c;在控制台里只输入函数名&#xff0c;不输入 () 然后按回车&#xff0c;就可以输出源码。 都不会陌生吧&#xff0c;这也有助于我们调试&#xff0c;是个很棒的技巧。不过系统内置的就会输…

值不值得入手_iPhone11现在还值不值得入手?真实用户说出心里话

iPhone11作为苹果走量的一款机型&#xff0c;自发布以来就备受争议&#xff0c;有的朋友说真香&#xff0c;A13iOS只卖4000多&#xff0c;还有的朋友吐槽大黑边、828P的屏幕、信号不好还有充电太慢&#xff0c;特别是现在同价位能买到的安卓旗舰&#xff0c;要5G有5G、要高刷新…

设备驱动,字符设备驱动、(总线)设备驱动模型、sysfs文件系统、平台设备驱动

以下内容转载于微信公众号&#xff1a;嵌入式企鹅圈。如有侵权&#xff0c;请告知删除。 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动、平台设备驱动、设备驱动模型和sysfs等相关概念和技术。 对于初学者来说会非常困惑&#xff0c;甚至对Linux有一定基础的工程师而言…

对于局部变量_对于SQL常用查询优化方法的整理

查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在where 及order by 涉及的列上建立索引:尝试下面的技巧以避免优化器错选了表扫描&#xff1a;使用ANALYZE TABLE tbl_name为扫描的表更新关键字分布。对扫描的表使用FORCE INDEX告知MySQL&#xff0c;相对于…

黄聪:如何使用CodeSmith批量生成代码(原创系列教程)

在上一篇我们已经用PowerDesigner创建好了需要的测试数据库,下面就可以开始用它完成批量代码生成的工作啦. 下面我会一步步的解释如何用CodeSmith实现预期的结果的,事先声明一下,在此只做一个简单的Demo,并不详细的讲解CodeSmith各个强大的功能,有兴趣的朋友可以打开CodeSmith的…

c语音异或运算符_C语言中的按位异或运算符有什么用处?

原标题&#xff1a;C语言中的按位异或运算符有什么用处&#xff1f;想知道C语言中的按位异、运算符有什么用处&#xff0c;首先C语言中^为按位异或运算符&#xff0c;若两个二进制位相同&#xff0c;则结果为0&#xff0c;不同为1例&#xff1a;#include "stdio.h"ma…

HDU2201

水&#xff5e; 分析&#xff1a;n&#xff0c;m。对于第一个人不抽到m号座位概率为&#xff08;n-1&#xff09;/n&#xff0c;第二个人为&#xff08;n-2&#xff09;/&#xff08;n-1&#xff09;.。。。第m个人为1/&#xff08;n-m1&#xff09;.。。。 相乘之后则为 1/n V…

字符设备驱动基础1——简单的驱动源代码分析

以下内容源于朱有鹏嵌入式课程的学习&#xff0c;如有侵权请告知删除。 参考博客&#xff1a;linux驱动开发&#xff08;一&#xff09; - biaohc - 博客园 一、驱动源代码示例 /********module_test.c代码*********/#include <linux/module.h> // module_init module…

字符设备驱动基础3——使用register_chrdev()函数注册字符设备

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、系统工作原理 1、工作流程 系统的整体工作流程是&#xff1a;应用层—>API—>设备驱动—>硬件。 操作系统提供的API包括open、read、write、close等函数&#xff0c;它们只是一种操作逻…

win7在未关闭vmware情况下直接关机,导致虚拟机无法克隆

今天有点小激动啊&#xff0c;着急关机&#xff0c;结果发现重启之后的虚拟机不能进行克隆操作。系统提示如下&#xff1a;the Specific Virtual Disk Needs Repair .查询“度娘”&#xff0c;突然看到一篇文章说&#xff0c;删除这啊&#xff0c;修改那的....特别复杂&#xf…

hdu 1159(最长公共子序列)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1159 思路&#xff1a;dp[i][j]表示s1从0~i-1,s2从0~j-1的最长公共子序列&#xff1b; 递推方程为&#xff1a;dp[i][j](s1[i-1]s2[j-1])?d[i-1][j-1]1:max(dp[i-1][j],dp[i][j-1]); View Code 1 #include<…

mysql applier_MySQL推出Applier,可实时复制数据到Hadoop-阿里云开发者社区

http://labs.mysql.comMySQL复制操作可以将数据从一个MySQL服务器(主)复制到其他的一个或多个MySQL服务器(从)。试想一下&#xff0c;如果从服务器不再局限为一个MySQL服务器&#xff0c;而是其他任何数据库服务器或平台&#xff0c;并且复制事件要求实时进行&#xff0c;是否可…

字符设备驱动基础4——读写接口的操作实践

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、细节提要 1、与用户与内核数据交换有关的函数 &#xff08;1&#xff09;copy_from_user()函数 该将数据从用户空间复制到内核空间。 如果成功复制则返回0&#xff0c;如果不成功复制则返回尚未…

mysql分区表mycat_MySQL 中间件之Mycat垂直分表配置

垂直分表就是将一个库下的多个表拆分到多个MySQL实例&#xff0c;实现库压力分流。通过GTID模式复制&#xff0c;db01与db02之间不进行任何连接与复制当前环境&#xff1a;mycat --> db01与db02db01 --> db03db02 --> db04当前垂直分表架构&#xff1a;后端数据库创建…

深入浅出mysql gtid_深入理解MySQL GTID

GTID的概念何为GITDGTID(global transaction identifier)是全局事务标识符&#xff0c;在MySQL5.6版本中作为一个超级特性被推出。事务标识不仅对于Master(起源)的服务器来说是惟一的&#xff0c;而且在整个复制拓扑架构来说&#xff0c;也是全局唯一的。1.GTID的格式GTID sou…

winform 64位系统中使用

WINFOR编译成X86的 转载于:https://blog.51cto.com/agilitygod/1419939

long 转为string_面试必问 Redis数据结构底层原理String、List篇

点击关注上方“Java大厂面试官”&#xff0c;第一时间送达技术干货。阅读文本大概需要 8 分钟。前言今天来整理学习下Redis有哪些常用数据结构&#xff0c;都是怎么使用的呢&#xff1f;首先看下全局存储结构。全局存储结构基础你们肯定都知道&#xff0c;redis支持的基础数据结…