实践中是否有人直接使用 environ 来访问环境变量?

实践中是否有人直接使用 environ 来访问环境变量?

C 标准库函数getenvsetenv可用于访问进程的环境变量。

在 Linux 中,有一个记录的全局变量environ,它保存环境变量值字符串,因此原则上可以直接使用它,而不必使用getenvsetenv

我的问题是:

  1. 为什么environ要向应用程序员公开和记录这些信息,尽管看起来没有必要这样做?

  2. 现在有任何软件或将来可能的软件可以environ直接使用吗?

答案1

  1. 首先回答你的第二个问题,
    • 简单地说,envprintenv程序用来environ列出整个环境。
    • 大多数 shell 习惯environ 将每个环境变量复制到导出的 shell 变量中。(例如,在 bash 中,诸如setexportdeclare(不带参数)之类的命令将列出整个环境以及非导出的变量。)
    • 我不确定他们如何处理它,但是su会将sudo环境的净化副本传递给他们调用的程序。他们可能会通过遍历环境并决定传递哪些变量、忽略哪些变量以及修改哪些变量来实现这一点。
  2. 为什么要向environ应用程序员公开并记录下来?
    • 因为有些程序需要它(见上文)。
    • 内核必须以某种方式将环境传递给进程(当它启动时)。  getenv并且setenv(还有一些其他东西)需要访问环境。内核与不活动的库例程进行通信(即,将信息传递给除调用内核的例程之外的程序的任何部分)非常棘手。如果您使用静态库,并且如果程序不调用它们,它们 getenv甚至setenv不会链接到您的进程映像中,那么这会变得更加困难。使用全局变量是最简单的解决方案。
    • 为什么设计者/开发人员要这样做呢?为什么不呢?进程拥有自己的环境;它可以对环境做任何想做的事情。

相关内容