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