C 库如何访问环境变量?

exl*_*mer 4 c environment-variables

当我的程序没有对环境的任何引用时,像 getenv(3) 这样的函数如何访问环境?

mos*_*svy 13

您的程序没有对环境的引用,而是它的完整副本

命令行参数和环境字符串(因为它们被传递给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将 pop argc,指向argv堆栈顶部,__libc_start_main并将设置__environ( 的别名environ)为argv + argc + 1