Linux

通過全域變數“environ”訪問的字元串是否反映了環境的任何變化?

  • August 17, 2019

來自https://unix.stackexchange.com/a/436631/674

該文件/proc/$$/environ…不反映對環境的任何更改,而只是報告程序exec在程序編輯時收到的內容。

來自 APUE:

每個程序還傳遞一個環境列表。與參數列表一樣,環境列表是一個字元指針數組,每個指針都包含一個以空字元結尾的 C 字元串的地址。指針數組的地址包含在全域變數中environ

extern char **environ;

訪問特定的環境變數通常是通過 7.9 節中描述的 getenvandputenv函式,而不是通過 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變數,也不知道程序用於儲存環境的資料結構。

引用自:https://unix.stackexchange.com/questions/437997