Environment-Variables
C 庫如何訪問環境變數?
當我的程序沒有對環境的任何引用時,getenv(3) 之類的函式如何訪問環境?
您的程序沒有對環境的引用,而是它的完整副本。
命令行參數和環境字元串(因為它們被傳遞給
execve(2)
系統呼叫)都打包在一起並複製到程序的地址空間中$$ 1 $$. 在典型的實現中
$$ 2 $$,指向它們的兩個
NULL
終止的指針列表(表示參數列表和環境)在堆棧上可用於程序的入口點(_start
),其中啟動程式碼(執行前main()
)將char **environ
全域變數指向開頭後者。 該getenv(3)
函式只是查看該environ
列表並依次比較每個條目。當一些新條目必須添加到環境中時(如
setenv(3)
),environ
列表將被重新定位到其他地方。$$ 1 $$在 Linux 上,參數列表和環境變數的地址可作為 的第 48 和第 50 欄位訪問
/proc/PID/stat
,請參閱procfs(5)
. $$ 2 $$在 glibc 中,_start
將 popargc
指向argv
堆棧的頂部,__libc_start_main
並將設置__environ
(的別名environ
)為argv + argc + 1
.