但是当我们第一次添加新名称时,我们必须调用 malloc 来获取新指针列表的空间。我们将旧的环境列表复制到这个新区域,并在指针列表的末尾存储一个指向 name=value 字符串的指针。但是这个列表中的大多数指针仍然指向堆栈顶部上方的 name=value 字符串(UNIX环境中的高级编程中说)。听起来队列中是否有新创建的环境列表或字符串。
答案1
环境变量与命令行参数一起存储在进程内存布局的顶部、堆栈上方。
答案2
环境(名称/值对)位于堆栈顶部。图 2 和第 3 节Linux/i386 ELF 二进制文件的启动状态显示环境在哪里。该文档有点过时了,因为ELF辅助向量也存在于堆栈中。
您可以使用一个小型 C 程序来检查这一点:
#include <stdio.h>
int main(int argc, char **argv, char **env)
{
printf("argv holds %p\n", argv);
printf("argv[0] holds %p\n", argv[0]);
printf("env holds %p\n", env);
printf("env[0] holds %p\n", env[0]);
return 0;
}
这并没有回答另一个类似的问题:当您export SOME_VAR
在 shell 中执行操作时,该 shell 将新的环境变量放在哪里? shell 必须将其环境保存在可以随意扩展的数据结构中,然后(转换为数组)用作系统调用envp
中的(第三个)参数execve(2)
。
答案3
环境变量是您正在使用的 shell 的表现。我认为整个环境是一个数据结构,它是构成流程的组成部分的一部分。
我不希望它们在所有进程的任何单一位置保存在一起,而是每个进程更有可能将环境变量与给定进程以及与给定进程相关的其他信息保存在一起。
如果您查看文件系统,您可以看到这一点,/proc
该文件系统维护有关在内核上运行的进程的信息。
例子
如果我们查找我的bash
流程之一:
$ ps -eaf| grep bash | tail -1
saml 12095 3211 0 May10 pts/53 00:00:04 bash
查看此进程/proc
区域(列出前 5 个):
$ sudo cat /proc/12095/environ | tr '\0' '\n' | head -5
rvm_log_path=/home/saml/.rvm/log
rvm_ruby_string=ruby-1.9.2-p180
TERM=xterm
SHLVL=1
KDEDIRS=/usr
这至少显示了该过程开始时的初始环境。我相信,/proc/PID/environ
当它得到增强时,它并不能反映该过程环境的主动表示。