c++ - 在静态初始化程序中使用 getenv() 是否安全,即在 main() 之前?

标签 c++ c unix posix environment

我查看了 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

-“外部”变量environgetenv()用作入口点。

-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/

相关文章:

c - "Refreshing"8051微 Controller :

c++ - VLFeat kmeans C API 解释

c - openMP:为什么我在使用 "#pragma omp parallel num_threads(4)"时没有得到不同的线程 ID

python - 有没有一种方法可以在没有 os.chmod 的情况下为 *nix 系统在 Python 中创建可执行文件?

c++ - 如何使 2 个玩家的随机骰子掷骰不同? (C++)

c++ - 未声明的标识符错误,其中似乎没有明显

linux - 在 vim 中折叠代码让我感到困惑

c++ - 假设任何 x86 编译的应用程序总是在 x64 版本下运行是否安全?

c++ - C++不能为子类编写构造函数

c++ - 奇怪的编译器错误和模板继承