我查看了史蒂文斯,并在Posix程序员指南中,我能找到的最好的是
当流程开始时,可以使用称为环境的字符串数组.外部变量指向此数组,外部变量
environ
定义为:
extern char **environ;
它是ENVIRON已经我犹豫变量.我想说
- 调用进程/ shell已经分配了空终止字符串块
- 'external'变量environ
用作getenv()的入口点.
- 事实上可以随意在静态初始化程序中调用getenv().
但我无法保证environ的"静态初始化" 优先于所有其他静态初始化代码.我是否想过这个?
更新在我的平台上(AMD Opteron,Redhat 4,GCC 3.2.3),设置LD_DEBUG表明在调用静态初始化程序之前environ已设置.这是一个很好的事情要知道; 谢谢,@ codelogic.但这并不一定是我在所有平台上得到的结果.
此外,虽然我直观地同意@ChrisW关于C/C++运行时库的行为,但这只是我基于经验的直觉.所以任何能够在静态初始化程序之前使用来自某个地方的权威保证环境的人都会被称为奖励积分!
我认为您可以使用LD_DEBUG设置运行程序以查看确切的顺序:
LD_DEBUG=all
编辑: 如果你看一下运行时链接器的源代码(glibc 2.7),特别是在文件中:
sysdeps/UNIX/SYSV/LINUX/INIT-first.c
sysdeps/I386/INIT-first.c
CSU/libc的-start.c
sysdeps/I386 /精灵/ start.S中
您将看到__
在调用任何全局构造函数(init函数)之前设置了argc,argv和environ(environ的别名 ).您可以从_start(实际入口点(start.S))开始执行.正如你引用史蒂文斯的那样"当进程开始时,可以使用称为环境的字符串数组",这表明环境分配在进程初始化的最初阶段发生.这由链接器代码支持,它做同样的事,应该让你足够安心:-)
编辑2:另外值得一提的是,environ设置得足够早,即使运行时链接器也可以查询它以确定是否要详细输出(LD_DEBUG).