我看了进去,并且在Posix 程序员指南 https://rads.stackoverflow.com/amzn/click/com/0937175730,我能找到的最好的是
称为的字符串数组环境当该过程开始时可用。
该数组由外部变量指向environ
,定义为:
extern char **environ;
就是那个environ让我犹豫的变量。我想说
- 调用进程/shell 已经分配了以 null 结尾的字符串块
-“外部”变量environ
被用作入口点getenv().
-本身欢迎致电getenv()在静态初始值设定项内。
但我找不到任何保证“静态初始化”environ位于所有其他静态初始化代码之前。我是不是想太多了?
Update
On my平台(AMD Opteron、Redhat 4、GCC 3.2.3)、设置LD_DEBUG表明environ已设置before我的静态初始化程序被调用。这是一件很高兴知道的事情;谢谢,@codelogic。但这不一定是我在所有平台上得到的结果。
另外,虽然我在 C/C++ 运行时库的行为上直观地同意@ChrisW,但这只是我基于经验的直觉。因此,任何可以引用权威人士的言论的人都可以保证environ在调用静态初始化器之前是否存在,加分!
我认为你可以设置 LD_DEBUG 来运行你的程序来查看确切的顺序:
LD_DEBUG=all <myprogram>
EDIT:如果您查看运行时链接器(glibc 2.7)的源代码,特别是在文件中:
- sysdeps/unix/sysv/linux/init-first.c
- sysdeps/i386/init-first.c
- csu/libc-start.c
- sysdeps/i386/elf/start.S
您将看到 argc、argv 和 environ(别名为__
environ)在调用任何全局构造函数(init 函数)之前设置。您可以从实际入口点 (start.S) _start 开始执行。正如你引用史蒂文斯的话“当进程开始时,称为环境的字符串数组可用”,表明环境分配发生在进程初始化的一开始。这由链接器代码支持,其作用相同,应该让您足够安心:-)
EDIT 2:另外值得一提的是,environ 设置得足够早,甚至运行时链接器也可以查询它以确定是否详细输出(LD_DEBUG)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)