当我的程序没有任何对环境的引用时,像 getenv(3) 这样的函数如何访问环境?
答案1
你的程序没有对环境的引用,而是一个整体复制它的。
命令行参数和环境字符串(当它们被传递给系统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
将弹出argc
,指向argv
堆栈顶部,并且__libc_start_main
会将__environ
( 的别名environ
)设置为argv + argc + 1
。