通過全域變數“environ”訪問的字元串是否反映了環境的任何變化?
來自https://unix.stackexchange.com/a/436631/674
該文件
/proc/$$/environ
…不反映對環境的任何更改,而只是報告程序exec
在程序編輯時收到的內容。來自 APUE:
每個程序還傳遞一個環境列表。與參數列表一樣,環境列表是一個字元指針數組,每個指針都包含一個以空字元結尾的 C 字元串的地址。指針數組的地址包含在全域變數中
environ
:extern char **environ;
訪問特定的環境變數通常是通過 7.9 節中描述的
getenv
andputenv
函式,而不是通過 environ 變數。但是要遍歷整個環境,就environ
必須使用指針。
/proc/$$/environ
和全域變數是environ
相互獨立還是相互一致?通過訪問的字元串是否
environ
也不會反映對環境的任何更改,而只是報告由 接收到的環境execve()
?或者通過訪問的字元串
environ
是否總是反映對它們的任何更改,就像getenv
總是獲得最新的環境字元串一樣?通過訪問的字元串是否
getenv
始終反映任何更改並且始終是最新的?謝謝。
/proc/$$/environ
並且變數environ
是獨立的。environ
確實反映了環境的變化,事實上,environ
當環境變數通過添加到環境中時,指針的值也會發生變化putenv()
(但這是一個實現細節。)我們必須區分系統呼叫級別和庫級別。在系統呼叫級別,與環境相關的唯一機制是呼叫的
envp
參數execve
。該參數應包含name=value
構成新程序環境的對。此環境被複製到新程序的堆棧中,使用者空間啟動程式碼可以在其中拾取它。在圖書館層面,我們有
- 全域變數
environ
,它指向環境的副本- 用於檢查和修改環境
getenv()
的功能putenv()
- 隱式(通過)或顯式(通過參數傳遞)訪問環境的
exec*
函式族(不包括)execve``environ
庫
exec*
函式最終呼叫execve
系統呼叫。變數不指向棧上的環境;而是在設置變數environ
之前將環境複製到程序堆(這又是一個實現細節。)environ
為什麼不
/proc/$$/environ
反映環境的變化?/proc/$$/environ
是核心提供的一個虛擬文件,核心無法知道在使用者程序的地址空間這個低層發生了什麼。核心不知道environ
變數,也不知道程序用於儲存環境的資料結構。