C 库如何访问环境变量?

C 库如何访问环境变量?

当我的程序没有任何对环境的引用时,像 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

相关内容