在linux系統編程中,環境變量的理解和使用是非常重要的。本文將詳細探討環境變量的相關問題,并提供相應的解決方案。
1. 環境變量
1.1 PATH引入
問題1: 我們平時使用的指令也是可執行程序,但為什么可以直接運行,而我們自己編譯過的就需要加上./呢?
可執行程序是一個進程,也是一個文件。查找文件時必須提供路徑。我們輸入的指令程序路徑被存儲在操作系統可以默認查找的路徑下,因此可以直接運行。但我們自己編譯的程序位于當前目錄下,并不在操作系統默認查找的路徑下,所以需要使用相對路徑查找。./code.c就是使用相對路徑,告訴操作系統我的可執行程序在當前目錄下,不用亂找了!
問題2: 操作系統默認查找的路徑在哪里存儲呢?
–> PATH環境變量中
操作系統默認搜索的路徑存儲在PATH環境變量中,我們可以通過echo $PATH查看PATH變量,其中:為分隔符。
我們平時使用的指令通常位于/usr/bin目錄下。如果直接執行自己的程序,會出現”command not found”,因為-bash命令行在默認的PATH路徑下查找過了,沒有找到。
問題3: 如果我想將自己的程序像指令一樣使用,該如何做呢?
辦法就是把我們自己的可執行程序放在默認查找路徑中,有兩種方法:
問題4: 如何添加PATH呢?
-
PATH=…..: 這種方法是直接對PATH變量賦值,會覆蓋掉原來的路徑。但即使我們不小心使用了,問題也不大,因為我們的指令都是內存級文件,每次啟動shell都會自動加載。
-
PATH=$PATH:…: 這種方法是追加目錄,也就是新增路徑。
1.2 HOME和SHELL
- HOME環境變量: 通常用于指定用戶的主目錄,也就是我們登錄shell時默認所處的目錄。我的默認用戶目錄就是ubuntu。
- SHELL變量: 存儲命令行解釋器的所在路徑,也就是-bash的路徑。
2. 查看所有環境變量的方法
2.1 命令行
2.2 系統調用接口
通過getenv獲取指定環境變量。
2.2.1 第三方變量
第三方環境變量:extern char** environ(二級指針)
3. 如何通過環境變量理解權限
我們知道權限的對象是使用者,也就是usr。我們可以通過環境變量獲取USER,來判斷對應的權限。
4. 命令行參數
4.1 main函數的指令參數
我們的main函數是可以帶參數的,因為它也是一個函數。
我們平時所使用的指令也是如此,諸如很多的選項就是這樣執行的。
4.2 main函數的環境變量參數
main除了argc和argv外還有環境變量參數–>env。
結論–>兩張向量表:
4.3 如何理解環境變量的全局性
我們知道了main函數的參數中是隱含了一張環境變量表的。我們的bash進程中也必然有環境變量表。而我們所使用的進程都是繼承自bash,所以環境變量表也會被繼承下去,每個進程中都可以使用,因此就相當于全局了。
根據前面的知識,如果是先創建了進程,然后再修改了環境變量,那么新創建的子進程必然會被繼承下去(共享數據)。但如果創建了子進程然后修改了環境變量并不會影響父進程的環境變量,因為會發生寫時拷貝。
4.4 本地變量和環境變量的區別
問題1: 什么是本地變量?
問題2: 和環境變量有什么區別?
本地變量存儲在棧上,而環境變量存儲在數據段,也就是全局變量區。
4.5 常規命令和內建命令
之前我們提到過,如果我們不小心將環境變量覆蓋了,那么就會導致大部分的指令用不了,但并不是所有的指令都用不了!比如echo、pwd、cd……因為它們是內建命令。
總結
環境變量表本質是一個二級指針。