获取系统信息==Linux应用编程3

一、关于时间的概念

1.GMT 时间

  • (1)GMT(Greenwich Mean Time)是格林尼治时间。
  • (2)意义:作为全球国际时间,用以描述全球性事件的时间,方便大家记忆。
  • (3)为了方便,一个国家都统一使用一个当地时间。

2.UTC 时间

  • (1)GMT 时间是以前使用的,现在越来越多地使用 UTC(Universal Time Coordinated)时间, 即通用协调时间。其实它与 GMT 一样,都与英国伦敦的本地时间一样。
  • (2)北京时间:北京是东八区,领先 UTC 八个小时,即 UTC + 8 = 北京时间。
二、Linux 系统中的时间

1.jiffies 的引入

  • (1)jiffies 是 Linux内核中一个全局变量,用来记录以内核的节拍时间为单位的数值
  • (2)内核配置的时候定义了一个节拍时间,Linux 内核调度系统工作时就是以这个节拍时间为时间片(轮询)的。
  • (3)jiffies 开机时有一个基准值,内核每过一个节拍时间 jiffies 就会+1。然后到了系统任意 一个时间,我们当前时间就被 jiffies 这个变量所标注。

2、Linux 系统如何记录时间

  • (1)内核在开机的时候会从 RTC 获取当前时间作为初始基准时间,这个时间对应着一个 jiffies 值。这个 jiffies 值的计算方法是:用当前时间减去 1970-01-01 00:00:00 + 0000 (UTC),然后把这个时间段换算成 jiffies 数值。
  • (2)系统运行时每个时钟节拍的末尾都会让 jiffies+1,当我们需要获取时间时,就用 jiffies 去计算。
  • (3)其实操系统只在开机时读取一次 RTC,整个系统运行过程中 RTC 是无作用的。RTC 真 正的作用是在 OS 的两次开机之间进行时间的保存。
  • (4)理解时一定要点时间和段时间结合起来理解,jiffies 这个变量记录的是段时间。
  • (5)一个时间节拍的长度取决于操作系统的配置,现代 Linux 一般是 10ms 或 1ms。这个时 间其实就是调度时间,在内核中用 HZ 来记录和表示。如果 HZ 定义成 1000 那么时间 节拍就是 1/1000,即 1ms。

3.Linux 系统中时间相关的系统调用

  • (1)常用的时间相关的 API 和库函数有 9 个:
    time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday
  • (2)time 系统调用返回当前时间以秒为单位的距离 1970-01-01 00:00:00 + 0000(UTC) 过去的秒数。内部其实是根据 jiffies 换算得到秒数。其他函数基本都是围绕着 time 来工作的。
  • (3)gmtime 和 localtime 会把 time 得到的秒数变成一个 struct tm 结构体表示的时间,区别 是 gmtime 得到的是国际时间,而 localtime 得到的是本地时间。
  • (4)总结:不管用哪个系统调用,最终得到的时间本质上都是一个时间,只不过不同的函 数返回的时间格式不同、精度不同。
#include 
#include 
#include 
int main(void)
{time_t tNow=-1;struct tm tmNow;//==============time//tNow=time(NULL);//返回值,获取系统时间,单位为秒time(&tNow);//指针做输出型参数if (tNow < 0) return -1;printf("time: %ld.\n", tNow);//=============ctimeprintf("ctime: %s.\n", ctime(&tNow));//=============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);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);return 0;
}
三、Linux 中使用随机数

1、随机数和伪随机数

  • (1)随机数是随机出现的,没有任何依据的一组数列。
  • (2)真正的随机数列是不存在的,只是一种理想情况,我们平时只能通过一些算法得到一 个伪随机数序列。
  • (3)我们平时说的随机数,基本都是指伪随机数。

2.Linux 中随机数相关 API

  • (1)连续多次调用 rand 函数可以返回一个伪随机数序列。
  • (2)srand 函数用来设置 rand 函数的种子。

3.实战演示

  • (1)单纯使用 rand 函数 n 次,可得到一个 0~RAND_MAX 之间的伪随机数序列。如果需要调整范围,可以在得到序列后再次进行计算。
  • (2)单纯使用 rand 函数来得到伪随机数序列有缺陷,每次执行程序得到的伪随机数序列是同一个序列。
  • (3)究其原因,是 rand 函数内部每次都使用 1 作为 seed,若想要得到不同的伪随机数序列, 就需要使用 srand 来设置种子。

4、总结

  • (1)在每次执行程序时,先用 srand 函数设置一个与上次不同的 seed,再多次调用 rand 函数,就可得到不同的伪随机数序列。
  • (2)通常用 time 函数返回值作为 srand 的参数。
    #include 
    #include 
    int main(int argc,char* arhv[])
    {int i=0,val=0;printf("RAND_MAX = %d.\n", RAND_MAX); // 2147483647srand(time(NULL));//time(NULL);获取系统时间,单位为秒,srand设置随机种子for(i=0;i<6;i++){val=rand();//生成随机数printf("%d ", (val % 6));}printf("\n");return 0;
    }
    

5、在Linux中获取一些真正的随机数

  • (1)收集一些随机发生的事件的时间(譬如有人动鼠标、触摸屏操作),作为种子去生成随 机数序列。
四、proc 文件系统介绍

1.操作系统级别的调试

  • (1)简单程序单步调试。
  • (2)复杂程序 printf 打印信息调试。
  • (3)框架体系日志记录信息调试。
  • (4)内核调试的困境。

2.proc 虚拟文件系统的工作原理

  • (1)Linux 是一个非常庞大、非常复杂的一个单独程序,对于这样一个程序来说调试是非常复杂的。
  • (2)像 kernel 这样庞大的项目,添加/更改一个功能是非常麻烦的,因为可能会影响到其他功能。
  • (3)为了降低内核调试和学习的难度,内核开发者们在内核中添加了一些属性,专门用于调试内核,proc 文件系统就是一个尝试。
  • (4)proc 文件系统的思路是:在内核中构建一个虚拟文件系统/proc,内核运行时将一些关 键的数据结构以文件在方式呈现在该目录中的一些特定文件里,相当于将不可见的内核 数据结构以可视化的方式呈现给内核开发者
  • (5)proc 目录下的文件大小都是 0,因为这些文件本身并不存在于硬盘中,它只是一个接 口。

3.常用的 proc 中的文件介绍

  • (1)/proc/cmdline
  • (2)/proc/cpuinfo
  • (3)/proc/devices
  • (4)/proc/interrupt

4、扩展:sys 文件系统

  • (1)与/proc 文件系统一样,都是虚拟文件系统,都在根目录下有个目录。
  • (2)不同的是/proc 中的文件只能读,/sys 中的文件可以读写。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部