3·Linux应用编程与网络编程---获取系统信息 笔记



1. 关于时间的概念

1·1 点时间 与 段时间
点时间:一个时间点
短时间:一段时间,有间隔。

1·2 定时器 与 实时时钟
定时器定的时间就是段时间;实时时钟RTC就是和点时间有关的一个器件

2· Linux系统中的时间

2·1 jiffies 的引入
jiffies是Linux内核中的一个全局变量,这个变量用来记录以jiffies为单位时间长度的一个数值。内核配置的时候定义了一个节拍时间,实际上Linux内核的调度系统工作时间时就是以这个节拍时间为时间片的。

jiffies = 内核节拍时间

2·2 Linux系统中时间相关的系统调用
(1)常见的时间相关的API和c库函数有9个:
API:time / ctime / localtime / gmtime / mktime / asctime / strftime / gettimeofday /
c库函数:time / ctime / localtime / gmtime / mktime / asctime / strftime / gettimeofday / settimeofday

(2)time系统调用返回当前时间以秒为单位的距离1970-01-01 00:00:00 +0000(UTC)过去的秒数。这个time内部就是用jiffies换算得到的秒数。其他函数基本都是围绕着time来工作的。
在这里插入图片描述
在这里插入图片描述
总结: 不管用哪个系统调用,最终得到的时间本质上都是一个时间(这个时间最终都是从内核中记录的jiffies中计算得来的),只不过不同的函数返回的时间的格式不同,精度不同。具体man手册。

3· Linux中使用随机数

3·1 随机数与伪随机数
(1)随机数是随机出现的,没有任何规律,真正的随机数是不存在的,只是一种理想情况。
(2)伪随机数是通过算法来的,一般伪随机数默认为随机数。

3·2 随机数相关API(Linux中)
(1)rand函数可以返回一个伪随机数序列
(2)srand函数用来设置rand获取的伪随机序列的种子

3·3 演示
int rand(void);

The rand() function returns a pseudo-random integer in the range 0 to
RAND_MAX inclusive (i.e., the mathematical range [0, RAND_MAX]).

rand函数返回一个0 到 RAND_MAX 的 伪随机数,RAND_MAX是rand函数内部的一个宏定义。

#include<stdio.h>
#include <stdlib.h>
int main (void)
{

	int val = 0,i = 0;

	printf("RAND_MAX = %d\n",RAND_MAX); 
	// 打印出RAND_MAX。可以知道伪随机数的范围

	for(i = 0;i < 6;i++)
	{

		printf("随机数:%d\n",(rand()) % 10);
		 //对随机数加工,对10取余就表示生成1到10的随机数
		// 由于是生成的随机数,
// 所以这6个1到10的随机数会出现重复。所以需要再加工。这里就步演示了
	}

	printf("\n");

	return 0;
}

结果:
cjj@cjj-virtual-machine:/mnt/hgfs/sharefile/AppNet/3.3$ ./a.out 
RAND_MAX = 2147483647
随机数:3
随机数:6
随机数:7
随机数:5
随机数:3
随机数:5


如果再一次执行这个程序,得到的随机数依旧是这个。

(1)单纯使用rand来得到伪随机数序列有缺陷,每次执行程序得到的伪随机序列是同一个序列, 原因是:rand内部的算法是通过一个种子seed(其实就是一个原始参数,int类型),rand函数内部默认1作为种子,种子的算法也是一定的,最后每次得到的随机序列也是同一个。所以要想每次获得不同的随机数序列,就要每次给不同的种子,所以就用srand函数来设置种子。

void srand(unsigned int seed);

The srand() function sets its argument as the seed for a new sequence
of pseudo-random integers to be returned by rand(). These sequences
are repeatable by calling srand() with the same seed value.
.
.
.

*int atoi(const char nptr);

The atoi() function converts the initial portion of the string pointed
to by nptr to int. The behavior is the same as
.
.
.

#include<stdio.h>
#include <stdlib.h>
int main (int argc,char *argv[])
{
	unsigned int val = 0,i = 0;

	if(2 != argc)
	{

		printf("usage : %s seednum\n",argv[0]);
		return -1;
	}

	srand( atoi (argv[1]) );
// atoi  就是将字符串格式转换为数字格式
	for(i = 0;i < 6;i++)
	{

		printf("随机数:%d\n",( rand() ) %10 );
	}

	printf("\n");

	return 0;
}

结果:
cjj@cjj-virtual-machine:/mnt/hgfs/sharefile/AppNet/3.3$ ./a.out 3
随机数:6
随机数:5
随机数:8
随机数:0
随机数:5
随机数:0

cjj@cjj-virtual-machine:/mnt/hgfs/sharefile/AppNet/3.3$ ./a.out 7
随机数:7
随机数:9
随机数:9
随机数:1
随机数:5
随机数:3

cjj@cjj-virtual-machine:/mnt/hgfs/sharefile/AppNet/3.3$ ./a.out 2
随机数:0
随机数:9
随机数:8
随机数:5
随机数:1
随机数:8

总结:每次执行程序时,先用srand设置一个不同的种子,然后再多次调用rand获取一个伪随机序列,这样就可以每次都得到一个不同的伪随机序列。
一般的做法就是用time函数的返回值作为srand的参数。

srand:

#include<stdio.h>
#include <stdlib.h>
#include <time.h>
int main (void)
{

	unsigned int i = 0;
	
	srand( time(NULL) );
/* 
srand (atoi ( time(NULL) ));
 原来写的这一句语句,报错信息说atoi传参是char *指针
 思考:这里没有弄清楚atio的作用
 	(将字符串(字符串是字符指针的形式)转为数字)
 	以及srand所传参数是一个unsigned int类型,
 	time函数的返回值是time_t类型(其实就是int类型的封装)
	所以并不需要atoi来转换。直接传给srand就可。

*/
	for(i = 0;i < 6;i++)
	{
		printf("随机数:%d\n",( rand() ) %10 );
	}

	printf("\n");

	return 0;
}

结果:
cjj@cjj-virtual-machine:/mnt/hgfs/sharefile/AppNet/3.3$ ./a.out 
随机数:8
随机数:1
随机数:2
随机数:9
随机数:3
随机数:8

cjj@cjj-virtual-machine:/mnt/hgfs/sharefile/AppNet/3.3$ ./a.out 
随机数:8
随机数:4
随机数:9
随机数:1
随机数:7
随机数:2

cjj@cjj-virtual-machine:/mnt/hgfs/sharefile/AppNet/3.3$ ./a.out 
随机数:3
随机数:8
随机数:3
随机数:4
随机数:3
随机数:2

存在的问题:
由于用的time函数的返回值作为种子,所以是以秒来分界。当这个程序在  一秒内  执行多次,那这几次得到的随机序列就是一样的。

3·4 Linux系统中获取真正的随机数
Linux系统收集系统中的一些随机发生的事件的事件(比如有人动鼠标,触摸屏的操作和坐标等)作为随机种子去生成随机数序列。

4· proc文件系统介绍

4·1 操作系统级别的调试
(1)简单程序单步调试:初学
(2)复杂程序printf打印信息调试
(3)框架体系日志记录信息调试:调试时间很长。
(4)内核调试的困境

4·2 proc虚拟文件系统的工作原理
(1)Linux内核是一个非常庞大,非常复杂的一个单独的程序,对于这样的一个程序来说调试是非常复杂的。如果给内核代码添加一个功能则会非常麻烦,因为添加的这样一个功能会影响其他已经有的。到了2·4左右的内核版本,为了降低内核调试和学习难度,内核开发者在内核中添加了一些属性专门用于调试内核,proc文件系统就是一个尝试。

(2)proc文件系统的思路就是:在内核中构建一个虚拟文件系统 / proc , 内核运行时将内核中一些关键的数据结构以文件的方式呈现在 / proc 目录的一些特定文件中,这样相当于将不可见的内核中的数据结构以可视化的方式呈现给内核开发者。

(3)proc文件系统给了开发者一种调试内核的方法:通过实时观察 / proc / xxx文件,来观看内核中特定数据结构的值。与我们添加一个新功能的前后来对比,就可以知道这个新功能产生的影响对还是不对

(4)proc目录下的文件大小都是 0 ,因为这些文件本身并不存在于硬盘中,他也不是一个真实的文件,他只是一个接口,当我们去读取这个文件时,其实内核并不是去硬盘上找这个文件,而是映射为 内核内部一个数据结构被读取 并且格式化成字符串返回给我们。所以即使我们看见的是一个文件内容字符串,和普通文件一样的;但是实际上我们知道这个内容是实时的从内核中数据结构来的,而不是从硬盘来的。

4·3 常用proc中的文件介绍:
(1)/ proc / cmdline
(2)/ proc / cpuinfo
(3)/ proc / devices
(4)/ proc / interrupts

5· proc文件系统的使用

5·1 cat 手工查看
cat / proc / devices

(2)程序中可以文件IO访问

(3)在shell程序中使用cat命令结合正则表达式来获取并处理内核信息。

拓展:sys文件系统本质上和proc文件系统一样,都是虚拟文件系统,都是在根目录下有个 / sys 目录,所以都不是硬盘中的文件,都是内核中的数据结构的可视化接口。 / proc文件系统只能读,但是 / sys 文件系统中的文件可以读写,读就是读 / sys 文件中所获取内核中的数据结构的值,而写入 / sys 就是设置内核中数据结构的元素的值。

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值