我查看了 Stevens ,并在 Posix Programmer's Guide ,我能找到的最好的是
An array of strings called the enviroment is made available when the process begins. This array is pointed to by the external variable
environ
, which is defined as:
extern char **environ;
正是那个 environ 变量让我犹豫不决。我想说
-调用进程/shell已经分配了空终止字符串 block
-“外部”变量environ
被getenv()用作入口点。
-ipso facto 随意在静态初始化程序中调用 getenv()。
但我无法保证 environ 的“静态初始化”在所有其他静态初始化代码之前。我是不是想多了?
更新
在 my 平台(AMD Opteron、Redhat 4、GCC 3.2.3)上,设置 LD_DEBUG 表明 environ 已设置 在调用我的静态初始化程序之前。这是一件好事。谢谢,@codelogic。但这不一定是我在所有平台上都能得到的结果。
此外,虽然我直观地同意 @ChrisW 关于 C/C++ 运行时库的行为,但这只是我基于经验的直觉。因此,任何可以从某个地方引用权威保证 environ 在调用静态初始化程序之前就存在的人,加分!
最佳答案
我认为您可以在设置 LD_DEBUG 的情况下运行程序以查看确切的顺序:
LD_DEBUG=all <myprogram>
编辑: 如果您查看运行时链接器(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(实际入口点 (start.S))开始跟踪执行。正如您所引用的 Stevens “当进程开始时提供一个称为环境的字符串数组”,这表明环境分配发生在进程初始化的最开始。这由链接器代码支持,它做同样的事情,应该让你足够安心:-)
编辑 2: 另外值得一提的是,environ 设置得足够早,即使运行时链接器也可以查询它以确定是否详细输出 (LD_DEBUG)。
关于c++ - 在静态初始化程序中使用 getenv() 是否安全,即在 main() 之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/437279/