过程的当前值的环境变量(Current value of process' environm

2019-08-02 06:17发布

我在想,如果有设置从bash进程的环境变量,并从其他阅读方式。

作为环境变量的值是本地进程(除了继承),不能随便做export FOO="bar"在终端和从其他阅读。 然后我试图通过让他们/proc/environ ,但是这是我的了:

etuardu@subranu:~$ FOO="foo" bash
etuardu@subranu:~$ strings /proc/$$/environ | grep FOO
FOO=foo
etuardu@subranu:~$ export FOO="bar"
etuardu@subranu:~$ strings /proc/$$/environ | grep FOO
FOO=foo
etuardu@subranu:~$ echo $FOO
bar

看来我可以得到,当进程启动环境变量所具有的值。
如何它的当前值?

Answer 1:

这是因为这样的环境变量的工作不是一般的可能。

当一个进程是第一个exec版,其初始组环境变量与一些其它的东西一起内核用品它(主要是其argv矢量,即其命令行)。 此后,该列表(如argv向量)是刚刚处理内的字符指针的一个常规的C数组。 这个过程是免费来管理它们是什么样子,包括完全回收保存的字符串一些其他用途,如果要记忆。 它是不安全的一个过程去任何其他进程的内存空间内偷看找到它的环境变量。

大多数类型的过程确实使用内核或多或少原来的样子,也许它查询与C库的功能,如修改它提供的环境变量列表getenv()putenv() 。 如果这些进程运行在轮到自己任何其他可执行文件,他们通过同样的环境载体的execve ,他们在自己的执行,这意味着新的可执行得到相同的环境中开始接受系统调用(可能由一些调用增强putenv()

炮弹是另一回事。 由于环境变量是在shell脚本如此重要,一些炮弹使用提供给他们的环境向量只能作为“初始值”,然后将其忽略。 他们用自己的,更强大,数据结构,管理他们的环境变量。 当他们执行自己的子进程,它们通过一个全新的环境载体,新工艺,从这些内部数据结构构成。 这意味着,即使你是窥视到一个shell的内存空间中寻找它的环境变量按照以上建议,你会发现只有初始设定,而不是外壳实际使用环境!

也许能够做的查询是一个进程的初始设置环境变量,也就是传递给可执行文件,当它开始相同的向量。 但是,这是不可移植的,甚至还有中支持此操作系统相当大的变化。 例如,在历史的UNIX,它仍然是一个有点难看,因为它仍然涉及偷看到进程的内存空间(虽然被称为“用户区”的内存的特殊区域)。 的Linux使这成为可能更优雅:所述载体可以发现在一个文本串/proc/<pid>/environ 。 在这里有可能得到这个信息最系统, ps有一个e这是能够表现出来的选项。



文章来源: Current value of process' environment variable