获取系统信息1——linux系统中的时间
2017-07-16 11:36
288 查看
以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。
用格林尼治的当地时间作为全球国际时间,用以描述全球性的事件的时间,方便大家记忆。
选这个地区,是因为它是天文学发源地。
参考http://www.cnblogs.com/qiuyi21/archive/2008/03/04/1089456.html。
定时器和实时时钟,定时器(timer)定的时间就是段时间,实时时钟(RTC)是和点时间有关的一个器件。
内核配置时定义了一个节拍时间,linux内核的调度系统工作时,以这个节拍时间为时间片;
开机时,jiffies变量有一个基准值,然后内核每过一个节拍时间jiffies就会加1。
这个基准时间对应一个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)即可得到这个时间点。
![](https://img-blog.csdn.net/20170521111005325)
(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。
![](https://img-blog.csdn.net/20170521111419208)
![](https://img-blog.csdn.net/20170521111534722)
![](https://img-blog.csdn.net/20170521114043347)
![](https://img-blog.csdn.net/20170521114108398)
(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中计算得来的);
不同的函数返回的时间的格式不同,精度不同。
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
![](https://img-blog.csdn.net/20170521122001251)
asctime和ctime得到的时间字符串都是固定格式的,没法用户自定义格式;
如果需要用户自定义时间的格式,则需要用strftime。
7、gettimeofday和settimeofday
前面讲到的基于time函数的那个系列都是以秒为单位来获取时间的,没有比秒更精确的时间;
有时候希望得到非常精确的时间(譬如以us为单位),只能通过gettimeofday来实现。
8、代码
一、关于时间的概念
1、GMT时间
GMT是格林尼治时间,也就是格林尼治地区的当地时间;用格林尼治的当地时间作为全球国际时间,用以描述全球性的事件的时间,方便大家记忆。
选这个地区,是因为它是天文学发源地。
2、UTC时间
GMT时间是以前使用的,近些年使用UTC时间;参考http://www.cnblogs.com/qiuyi21/archive/2008/03/04/1089456.html。
3、计算机中与时间有关的部件
点时间和段时间,段时间=点时间-点时间定时器和实时时钟,定时器(timer)定的时间就是段时间,实时时钟(RTC)是和点时间有关的一个器件。
二、linux系统中的时间
1、jiffies的引入
jiffies是linux内核中的一个全局变量,是(以内核的节拍时间为单位时间)一个数值,由此数值可以知道过了多少个节拍;内核配置时定义了一个节拍时间,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中时间相关的系统调用
(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、timetime能得到一个当前时间距离标准起点时间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; } p b181 rintf("time: %ld.\n", tNow); // ctime printf("ctime: %s.\n", ctime(&tNow));//ctime可以从time_t出发得到一个容易观察的字符串格式的当前时间; #if 0 // gmtime 和localtime memset(&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 // asctime 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); printf("asctime:%s.\n", asctime(&tmNow)); #endif #if 0 // strftime 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); memset(buf, 0, sizeof(buf)); strftime(buf, sizeof(buf), "%Y * %m * %d, %H-%M-%S.", &tmNow); printf("时间为:[%s].\n", buf); #endif // gettimeofday ret = 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; }
相关文章推荐
- Linux C 获取系统时间信息
- Linux C 语言 获取系统时间信息
- Linux C 语言 获取系统时间信息
- Inxi:获取Linux系统和硬件信息的神器
- 转:python获取linux系统及性能信息
- Python获取Linux或Windows系统的基本信息
- linux驱动层获取当前的系统时间
- 使用Python收集获取Linux系统主机信息
- linux获取系统信息的常用命令
- 菜鸟自学ARM:linux下编程获取系统时间和设置时间
- linux系统使用python获取内存使用信息脚本分享
- Inxi:获取Linux的系统和硬件信息
- Linux 获取文件时间信息 判断文件是否存在
- python获取linux的系统信息
- 程序中获取linux系统启动时间方法
- linux 获取系统当前时间
- php获取Linux系统运行时间
- Linux 内核、系统 版本信息 获取
- linux时间-获取系统时间
- linux获取系统当前时间