寧波網(wǎng)站建設(shè)公司軟文范例大全1000字
【Linux進(jìn)程篇】環(huán)境變量
目錄
- 【Linux進(jìn)程篇】環(huán)境變量
- 基本概念
- 常見環(huán)境變量
- 查看環(huán)境變量方法
- 測(cè)試PATH
- 測(cè)試HOME
- 測(cè)試SHELL
- 和環(huán)境變量相關(guān)的命令
- 環(huán)境變量的組織方式
- 通過代碼如何獲取環(huán)境變量
- 命令行參數(shù)
- 命令行第三個(gè)參數(shù)
- 通過第三方變量environ獲取
- 本地變量
- 通過系統(tǒng)調(diào)用獲取或設(shè)置環(huán)境變量
- 環(huán)境變量通常是具有全局屬性的
- 驗(yàn)證子進(jìn)程會(huì)繼承父進(jìn)程的環(huán)境變量
- 驗(yàn)證子進(jìn)程不會(huì)繼承父進(jìn)程的本地變量
作者:愛寫代碼的剛子
時(shí)間:2023.8.13
前言:本篇博客主要介紹操作系統(tǒng)中環(huán)境變量有關(guān)的知識(shí),了解環(huán)境變量有關(guān)的指令。
基本概念
- 環(huán)境變量(environment variables)一般是指在操作系統(tǒng)中用來指定操作系統(tǒng)運(yùn)行環(huán)境的一些參數(shù)
- 如:我們?cè)诰帉慍/C++代碼的時(shí)候,在鏈接的時(shí)候,從來不知道我們的所鏈接的動(dòng)態(tài)靜態(tài)庫在哪里,但是照樣可以鏈接成功,生成可執(zhí)行程序,原因就是有相關(guān)環(huán)境變量幫助編譯器進(jìn)行查找。
- 環(huán)境變量通常具有某些特殊用途,還有在系統(tǒng)當(dāng)中通常具有全局特性
常見環(huán)境變量
- PATH : Linux系統(tǒng)的指令搜索路徑
- HOME : 指定用戶的主工作目錄(即用戶登陸到Linux系統(tǒng)中時(shí),默認(rèn)的目錄)
- SHELL : 當(dāng)前Shell,它的值通常是/bin/bash。
查看環(huán)境變量方法
- echo $NAME //NAME:你的環(huán)境變量名稱
測(cè)試PATH
添加PATH
- 注意不能寫做:PATH=新路徑名稱,否則之前的PATH將會(huì)全部清空
正確寫法:
直接運(yùn)行test.exe文件:
此環(huán)境變量是內(nèi)存級(jí)別的,當(dāng)用戶如果不小心改錯(cuò)了重新登陸Xshell即可。(系統(tǒng)文件中已經(jīng)預(yù)存好了環(huán)境變量)
測(cè)試HOME
用root和普通用戶,分別執(zhí)行 echo $HOME ,對(duì)比差異
測(cè)試SHELL
保存的是當(dāng)前shell的可執(zhí)行程序
. 執(zhí)行 cd ~ ; pwd,對(duì)應(yīng)~ 和 HOME 的關(guān)系
和環(huán)境變量相關(guān)的命令
- echo: 顯示某個(gè)環(huán)境變量值
- export: 設(shè)置一個(gè)新的環(huán)境變量
- env: 顯示所有環(huán)境變量
- HISTSIZE Xshell能記錄的最大歷史指令條數(shù)
- USER當(dāng)前用戶
- LD_LIBRARY_PATH指定查找共享庫(動(dòng)態(tài)鏈接庫)時(shí)除了默認(rèn)路徑之外的其他路徑。
- PATH可執(zhí)行程序的搜索路徑
- LS_COLORS ls的配色方案
- MAIL是指當(dāng)前用戶的郵件存放目錄。
- PWD當(dāng)前所處的路徑
- LANG用于定義系統(tǒng)的主語系環(huán)境
- HISTCONTROL可以控制歷史的記錄方式
- HOME用戶的主目錄(也稱家目錄)
- SHLVL記錄了bash嵌套的層次,一般來說,我們啟動(dòng)第一個(gè)Shell時(shí)。 $SHLVL=1。如果在這個(gè)Shell中執(zhí)行腳本,腳本中的 $SHLVL=2 。
- LOGNAME LOGNAME
- LESSOPEN
- unset: 清除環(huán)境變量(unset +環(huán)境變量名)
- set: 顯示本地定義的shell變量和環(huán)境變量
環(huán)境變量的組織方式
每個(gè)程序都會(huì)收到一張環(huán)境表,環(huán)境表是一個(gè)字符指針數(shù)組,每個(gè)指針指向一個(gè)以’\0’結(jié)尾的環(huán)境字符串
通過代碼如何獲取環(huán)境變量
命令行參數(shù)
main函數(shù)并不是第一個(gè)被調(diào)用的函數(shù),而是startup函數(shù)
編譯器如何知道m(xù)ain函數(shù)的參數(shù)個(gè)數(shù)?(答:條件編譯)
- argc就是argv數(shù)組中的元素個(gè)數(shù),argv指針數(shù)組也叫向量表
- 輸入./test -a -b其實(shí)是"./test -a -b",bash會(huì)將其分成三個(gè)字符串"./test" “-a” “-b”,將這些字符串初始化argv指針*數(shù)組
- 命令行參數(shù)可以為指令、工具、軟件提供功能選項(xiàng)支持(指令可以帶不同的選項(xiàng)和命令行參數(shù)有關(guān))
命令行第三個(gè)參數(shù)
C/C++代碼會(huì)有兩張核心向量表:(1. 命令行參數(shù)表,2. 環(huán)境變量表),不要簡(jiǎn)單理解程序啟動(dòng)就是將進(jìn)程加載到內(nèi)存,而是自己的程序在啟動(dòng)時(shí),需要有人調(diào)用main函數(shù),將這兩張核心向量表傳進(jìn)來
- 我們所運(yùn)行的進(jìn)程,都是子進(jìn)程,bash本身在啟動(dòng)的時(shí)候會(huì)從操作系統(tǒng)的配置文件中讀取環(huán)境變量信息,子進(jìn)程會(huì)繼承父進(jìn)程交給我們的環(huán)境變量,我們定好的環(huán)境變量可以讓所有的子進(jìn)程繼承下去,所以環(huán)境變量具有全局屬性
- 但是注意!環(huán)境變量也是數(shù)據(jù),默認(rèn)情況下是父子共享的,由于進(jìn)程具有獨(dú)立性,創(chuàng)建完子進(jìn)程后,如果想對(duì)環(huán)境變量進(jìn)行修改,是不能影響父進(jìn)程的,因?yàn)闀?huì)寫實(shí)拷貝
環(huán)境變量被繼承通常有兩種方式:1. 直接繼承 2. main函數(shù)傳參
通過第三方變量environ獲取
#include <stdio.h>
int main(int argc, char *argv[])
{extern char **environ;int i = 0;for(; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}
libc中定義的全局變量environ指向環(huán)境變量表,environ沒有包含在任何頭文件中,所以在使用時(shí)要用extern聲明。
程序在編譯過程中會(huì)鏈接C庫, 所以, extren本身就是說我有一個(gè)什么樣子的變量, 然后在鏈接的過程當(dāng)中在 C庫可以找到這個(gè)是正常的。
本地變量
- 直接在命令行定義的變量叫做本地變量:
- set查看本地變量和環(huán)境變量
本地變量是不會(huì)被子進(jìn)程繼承的
通過系統(tǒng)調(diào)用獲取或設(shè)置環(huán)境變量
-
putenv("環(huán)境變量=value")
-
getenv("環(huán)境變量")
-
可以通過比較getenv(“USER”)來判斷登陸用戶是不是正確的,和權(quán)限建立起連接
常用getenv和putenv函數(shù)來訪問特定的環(huán)境變量。
環(huán)境變量通常是具有全局屬性的
- 環(huán)境變量是系統(tǒng)提供的一組name=value形式的變量,不同的環(huán)境變量有不同的用戶,通常具有全局屬性。
- 環(huán)境變量通常具有全局屬性,可以被子進(jìn)程繼承下去
驗(yàn)證子進(jìn)程會(huì)繼承父進(jìn)程的環(huán)境變量
- 導(dǎo)入環(huán)境變量:
- 運(yùn)行test:
子進(jìn)程是可以繼承父進(jìn)程的環(huán)境變量的
驗(yàn)證子進(jìn)程不會(huì)繼承父進(jìn)程的本地變量
雖然子進(jìn)程不會(huì)繼承父進(jìn)程的本地變量,但是我們可以向子進(jìn)程中導(dǎo)入父進(jìn)程的本地變量:
【問題】:echo也是bash的子進(jìn)程,那為什么echo能拿到并顯示父進(jìn)程的本地變量呢?
答:命令行上的指令并不一定都需要?jiǎng)?chuàng)建子進(jìn)程,所以命令分為兩種命令:
- 常規(guī)命令——通過子進(jìn)程創(chuàng)建來完成
- 內(nèi)建命令——bash不創(chuàng)建子進(jìn)程,而是由自己親自執(zhí)行,類似于bash調(diào)用自己的寫的,或者系統(tǒng)提供的函數(shù)(cd指令、echo指令)
所以echo是內(nèi)建命令,自己獲取自己的本地變量,不創(chuàng)建子進(jìn)程
【附】:
chdir函數(shù)用于改變當(dāng)前工作目錄。調(diào)用參數(shù)是指向目錄的指針,調(diào)用進(jìn)程需要有搜索整個(gè)目錄的權(quán)限。每個(gè)進(jìn)程都具有一個(gè)當(dāng)前工作目錄。在解析相對(duì)目錄引用時(shí),該目錄是搜索路徑的開始之處。如果調(diào)用進(jìn)程更改了目錄,則它只對(duì)該進(jìn)程有效,而不能影響調(diào)用它的那個(gè)進(jìn)程。在退出程序時(shí),shell還會(huì)返回開始時(shí)的那個(gè)工作目錄。