环境变量属于谁?

now*_*wox 6 linux environment-variables

我从几个网站上读到这getenv是一个系统调用。但是我找不到任何对sys_getenv.

我试图确切地了解“环境变量”是什么。它们是内核的一部分还是外壳的一种机制?深入挖掘一点,我发现它getenv是标准 C 库的一部分。不幸的是,这并不能帮助我回答我原来的问题。

Sco*_*ott 10

你了解参数列表吗?例如,如果您键入ls -l foo bar,shell 将/bin/ls使用由四个字符串组成的参数列表执行:

    ls -l foo bar

而如果您键入ls -l "foo bar" (or ls -l 'foo bar'or ls -l foo\ bar),shell 将/bin/ls使用由三个字符串组成的参数列表执行:

    ls -l foo bar

并且ls -l *可能会让你得到类似的东西:

    ls -l ant bat cat dog etc

即,当前目录中的任何文件。

好,

环境基本上只是第二个参数列表。

也许最好说“环境是第二个字符串列表,结构与参数列表完全相同,但处理方式不同。” 如果您查看execve(2),您会看到execve系统调用采用三个参数:

  • char *filename,                                (要执行的程序;例如, /bin/ls
  • 字符 *argv[],
  • 字符 *envp[]

每当任何程序执行任何其他程序时,它基本上都在使用execve (可能通过一些更高级别的函数,例如execl),因此它传递了一个参数列表和一个环境列表。环境列表看起来很像env; 例如,

    HOME=/home/fred USERNAME=fred PATH=/bin:/usr/bin:… TERM=xterm SHELL=/bin/bash PWD=/home/fred/Super_User_files
    等等…

执行的程序可以对环境列表做任何它想做的事情——查看它(例如,使用getenv)、修改它或忽略它——它可以对参数列表做同样的事情。当一个程序使用更高级别的执行函数之一执行另一个程序时,例如execl,它会自动execve 使用传递给程序的相同环境列表调用。这就是 90% 执行其他程序的程序所发生的情况。但是 shell 允许您修改环境,然后它们execve直接使用将最新的用户指定的环境传递给它运行的每个程序。

TL; 博士

每个进程在内存中都包含它的环境列表,就像它包含它的参数列表和普通变量一样。环境通过exec机制从程序传递到程序。库函数使程序可以轻松地将自己的环境传递给它运行的任何其他程序。(自然,环境被保存(复制)到一个fork,就像所有其他本地内存一样。)内核实际上并不知道关于环境的任何事情,除了它提供了一种让环境通过 的方法这一事实execve