1. 程式人生 > >3.3 Linux獲取系統資訊(5、6、7節)

3.3 Linux獲取系統資訊(5、6、7節)

3.3.5.linux中使用隨機數

3.3.5.1、隨機數和偽隨機數

(1)隨機數是隨機出現,沒有任何規律的一組數列。
(2)真正的完全隨機的數列是不存在的,只是一種理想情況。我們平時要用到隨機數時一般只能通過一些演算法得到一個偽隨機數序列。
(3)我們平時說到隨機數,基本都指的是偽隨機數。

3.3.5.2、linux中隨機數相關API

(1)連續多次呼叫rand函式可以返回一個偽隨機數序列
(2)srand函式用來設定rand獲取的偽隨機序列的種子

3.3.5.3、實戰演示

(1)單純使用rand重複呼叫n次,就會得到一個0-RAND_MAX之間的偽隨機數,如果需要調整範圍,可以得到隨機數序列後再進行計算。
(2)單純使用rand來得到偽隨機數序列有缺陷,每次執行程式得到的偽隨機序列是同一個序列,沒法得到其他序列
(3)原因是因為rand內部的演算法其實是通過一個種子(seed,其實就是一個原始引數,int型別),rand內部預設是使用1作為seed的,種子一定的演算法也是一定的,那麼每次得到的偽隨機序列肯定是同一個。

(4)所以要想每次執行這個程式獲取的偽隨機序列不同,則每次都要給不同的種子。用srand函式來設定種子。

#include <stdio.h>
#include <stdlib.h>



int main(int argc, char **argv)
{
	int i = 0, val = 0;
	
/*	if (argc != 2)
	{
		printf("usage: %s num\n", argv[0]);
		return -1;
	}
*/	
	printf("RAND_MAX = %d.\n", RAND_MAX);		// 2147483647
	
	//srand(atoi(argv[1]));
	srand(time(NULL));
	for (i=0; i<6; i++)
	{
		val = rand();
		printf("%d ", (val % 6));
	}
	printf("\n");
	
	return 0;
}

3.3.5.4、總結和說明

(1)在每次執行程式時,先用srand設定一個不同的種子,然後再多次呼叫rand獲取一個偽隨機序列,這樣就可以每次都得到一個不同的偽隨機序列。
(2)一般常規做法是用time函式的返回值來做srand的引數。

3.3.5.5、在linux系統中獲取真正的隨機數

(1)linux系統收集系統中的一些隨機發生的事件的時間(譬如有人動滑鼠,譬如觸控式螢幕的操作和座標等)作為隨機種子去生成隨機數序列。


3.3.6.proc檔案系統介紹

3.3.6.1、作業系統級別的除錯

(1)簡單程式單步除錯
(2)複雜程式printf列印資訊除錯
(3)框架體系日誌記錄資訊除錯
(4)核心除錯的困境

3.3.6.2、proc虛擬檔案系統的工作原理

(1)linux核心是一個非常龐大、非常複雜的一個單獨的程式,對於這樣的一個程式來說除錯是非常複雜的。
(2)項kernel這樣龐大的專案,給裡面新增/更改一個功能是非常麻煩的,因為你這新增的一個功能可能會影響其他已經有的。
(3)早期核心版本中儘管除錯很麻煩,但是高手們還可以憑藉個人超凡脫俗的能力去駕馭。但是到了2.4左右的版本的時候,這個難度已經非常大了。
(4)為了降低核心除錯和學習的難度,核心開發者們在核心中添加了一些屬性專門用於除錯核心,proc檔案系統就是一個嘗試。
(5)proc檔案系統的思路是:在核心中構建一個虛擬檔案系統/proc,核心執行時將核心中一些關鍵的資料結構以檔案的方式呈現在/proc目錄中的一些特定檔案中,這樣相當於將不可見的核心中的資料結構以視覺化的方式呈現給核心的開發者。
(6)proc檔案系統給了開發者一種除錯核心的方法:我們通過實時的觀察/proc/xxx檔案,來觀看核心中特定資料結構的值。在我們新增一個新功能的前後來對比,就可以知道這個新功能產生的影響對還是不對。
(7)proc目錄下的檔案大小都是0,因為這些檔案本身並不存在於硬碟中,他也不是一個真實檔案,他只是一個介面,當我們去讀取這個檔案時,其實核心並不是去硬碟上找這個檔案,而是對映為核心內部一個數據結構被讀取並且格式化成字串返回給我們。所以儘管我們看到的還是一個檔案內容字串,和普通檔案一樣的;但是實際上我們知道這個內容是實時的從核心中資料結構來的,而不是硬碟中來的。

3.3.6.3、常用proc中的檔案介紹

(1)/proc/cmdline
(2)/proc/cpuinfo
(3)/proc/devices

(4)/proc/interrupts


3.3.7.proc檔案系統的使用

3.3.7.1、cat以手工檢視

3.3.7.2、程式中可以檔案IO訪問

3.3.7.3、在shell程式中用cat命令結合正則表示式來獲取並處理核心資訊

3.3.7.3、擴充套件:sys檔案系統

(1)sys檔案系統本質上和proc檔案系統是一樣的,都是虛擬檔案系統,都在根目錄下有個目錄(一個是/proc目錄,另一個是/sys目錄),因此都不是硬碟中的檔案,都是核心中的資料結構的視覺化介面。
(2)不同的是/proc中的檔案只能讀,但是/sys中的檔案可以讀寫。讀/sys中的檔案就是獲取核心中資料結構的值,而寫入/sys中的檔案就是設定核心中的資料結構的元素的值。
(3)歷史上剛開始先有/proc檔案系統,人們希望通過這種技術來除錯核心。實際做出來後確實很有用,所以很多核心開發者都去核心調價程式碼向/proc目錄中寫檔案,而且剛開始的時候核心管理者對proc目錄的使用也沒有什麼經驗也沒什麼統一規劃,後來的結果就是proc裡面的東西又多又雜亂。

(4)後來覺得proc中的內容太多太亂缺乏統一規劃,於是乎又添加了sys目錄。sys檔案系統一開始就做了很好的規劃和約定,所以後來使用sys目錄時有了規矩。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main(int argc, char **argv)
{
	int fd = -1;
	char buf[512] = {0};
	
	if (argc != 2)
	{
		printf("usage: %s -v|-d\n", argv[0]);
		return -1;
	}
	
	if (!strcmp(argv[1], "-v"))
	{
		fd = open("/proc/version", O_RDONLY);
		if (fd < 0)
		{
			perror("open /proc/version");
			return -1;
		}
		read(fd, buf, sizeof(buf));
		printf("結果是:%s.\n", buf);
	}
	else if (!strcmp(argv[1], "-d"))
	{
		fd = open("/proc/devices", O_RDONLY);
		if (fd < 0)
		{
			perror("open /proc/devices");
			return -1;
		}
		read(fd, buf, sizeof(buf));
		printf("結果是:%s.\n", buf);
	}
	
	return 0;
}