Environment-Variables

C 庫如何訪問環境變數?

  • March 6, 2020

當我的程序沒有對環境的任何引用時,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.

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