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