做軟件跟網(wǎng)站哪個(gè)難網(wǎng)頁(yè)制作公司排名
一、認(rèn)識(shí)常見的環(huán)境變量
1.?echo $HOME
輸出當(dāng)前用戶對(duì)應(yīng)的家目錄
當(dāng)用戶登錄系統(tǒng)時(shí),流程如下:
(1)用戶登錄系統(tǒng)后,系統(tǒng)啟動(dòng)Shell程序。
(2)啟動(dòng)bash shell,準(zhǔn)備接收用戶指令。
(3)在bash啟動(dòng)過程中,它會(huì)讀取環(huán)境變量配置文件,如 .bashrc 或 .profile 等。
(4)從配置文件中加載重要的環(huán)境變量,例如 PATH 和 HOME :
?????????PATH變量定義了命令的搜索路徑,使得用戶可以運(yùn)行各種程序。
? ? ? ? ?HOME變量指定了用戶的主目錄,通常為?/home/usr(usr 應(yīng)由實(shí)際的用戶名代替)。
(5)需要注意的是,bash本身也是一個(gè)進(jìn)程,它在操作系統(tǒng)中運(yùn)行并具有唯一的進(jìn)程ID。
(6)當(dāng)bash進(jìn)程啟動(dòng)時(shí),它會(huì)設(shè)置當(dāng)前工作目錄(cwd),即當(dāng)前所在的目錄位置。
(7)通常情況下,登錄后的bash進(jìn)程的當(dāng)前工作目錄會(huì)設(shè)置為用戶的主目錄,
? ? ? ? ?例如 cwd -> /home/usr。
(8)用戶在命令行輸入的每一條命令,都會(huì)被bash進(jìn)程解析并執(zhí)行。
?????????這些命令實(shí)際上是bash進(jìn)程的子進(jìn)程,它們繼承了bash進(jìn)程的環(huán)境變量和權(quán)限。
2. echo $SHELL
命令的作用是輸出當(dāng)前用戶的默認(rèn)shell的路徑。
3. USER
在Linux操作系統(tǒng)中,環(huán)境變量USER是用來存儲(chǔ)當(dāng)前登錄用戶的用戶名的。
在編寫Shell腳本或程序時(shí),可以使用$USER獲取當(dāng)前登錄的用戶名,并根據(jù)不同的用戶執(zhí)行不同的操作。
二、理解環(huán)境變量
系統(tǒng)提供的具有“全局屬性”的變量
1. 環(huán)境變量和本地變量
export 可以將本地變量導(dǎo)出到環(huán)境變量。
環(huán)境變量是可以被子進(jìn)程繼承下去的,而本地變量不行。
【Q】那么 fork() 創(chuàng)建的子進(jìn)程呢?
【A】環(huán)境變量可以被所有bash之后的進(jìn)程看到,所以環(huán)境變量具有全局屬性。
這樣設(shè)計(jì)的理由如下:
(1)系統(tǒng)的配置信息,尤其是具有“指導(dǎo)性”的配置信息,它是系統(tǒng)配置起效的一種表現(xiàn)
(2)進(jìn)程具有獨(dú)立性,環(huán)境變量可以用來在進(jìn)程間傳遞數(shù)據(jù)(只讀數(shù)據(jù))
2. environ
environ 被定義為一個(gè)指向 char * 的指針數(shù)組,這意味著它是一個(gè)指向字符串?dāng)?shù)組的指針。每個(gè)字符串表示一個(gè)環(huán)境變量,格式為 "NAME=value"
由于 environ 是一個(gè)全局變量,因此不需要顯式地聲明它,但是可以通過 extern 關(guān)鍵字來聲明以便使用它
extern char **environ;
這行代碼告訴編譯器 environ 是一個(gè)已經(jīng)存在的指針數(shù)組,可以用來訪問環(huán)境變量。
遍歷方法如下:
int i = 0;
for (; environ[i]; ++i) {printf("environ[%d]: %s\n", i, environ[i]);
}
三、進(jìn)程地址空間 Pt.1
1. 地址空間
高地址
命令行參數(shù) 環(huán)境變量 |
棧 |
?? |
共享區(qū) |
?? |
堆 |
未初始化數(shù)據(jù) |
初始化數(shù)據(jù) |
正文代碼 |
低地址
進(jìn)程地址空間不是程序地址空間
- 操作系統(tǒng)讓每一個(gè)進(jìn)程都認(rèn)為自己是獨(dú)占系統(tǒng)物理內(nèi)存大小,進(jìn)程彼此之間不知道,不關(guān)心對(duì)方的存在,從而實(shí)現(xiàn)一定程度的隔離
- 先描述再組織:所謂的進(jìn)程虛擬地址空間,本質(zhì)是一個(gè)內(nèi)核數(shù)據(jù)結(jié)構(gòu)對(duì)象(類似PCB)
?2. 區(qū)域劃分
struct destoproom{int start_part1, end_part2;int start_part2, end_part2;
};struct destoproom part = {1, 50, 51, 100};
區(qū)域劃分的本質(zhì):告知開始和結(jié)束即可
3. 地址空間上的地址
2^32*1 字節(jié) = 4 GB
一共會(huì)存在2^32個(gè)地址
- 地址本質(zhì)上就是一個(gè)數(shù)字,可以被保存為unsigned long(4字節(jié))
- 空間范圍內(nèi)的地址,可以隨便用,暫時(shí)不需要記錄它的地址
操作系統(tǒng)會(huì)構(gòu)建頁(yè)表,構(gòu)建虛擬地址和物理地址的映射關(guān)系
struct mm_struct + 頁(yè)表 = 虛擬內(nèi)存管理方案
父子進(jìn)程映射到同樣的代碼內(nèi)存區(qū)域,所以父子進(jìn)程代碼共享(類似淺拷貝)
故在父子進(jìn)程不修改變量時(shí),數(shù)據(jù)其實(shí)也是共享的
修改 ?? 寫入 ?? 進(jìn)程具有獨(dú)立性 ?? 把目標(biāo)內(nèi)存拷貝一份,修改物理地址,重新建立映射,但虛擬地址不變,上述過程由OS自主完成,被稱為寫時(shí)拷貝機(jī)制
進(jìn)程 = 內(nèi)核數(shù)據(jù)結(jié)構(gòu)(task_struct, mm_struct, 頁(yè)表)+ 自己的代碼和數(shù)據(jù)
進(jìn)程的獨(dú)立性:內(nèi)核數(shù)據(jù)結(jié)構(gòu)各自一份,代碼和數(shù)據(jù)也是獨(dú)立的