环境变量继承异常

Tim*_*Tim 5 environment-variables

引自维基百科

默认情况下,创建进程时,它继承其父进程的重复环境,但父进程在创建子进程时所做的显式更改除外。在 API 级别,这些更改必须在 fork 和 exec 之间完成。或者,在 bash 等 shell 中,您可以通过 env 或使用 ENVIRONMENT_VARIABLE=VALUE 符号间接调用特定命令调用来更改环境变量。

我理解“当一个进程被创建时,它继承了其父进程的重复环境”。但我想知道异常“父级在创建子级时所做的显式更改”的真正含义是什么?我不明白 API 和 shell 中的示例如何成为异常示例。

Gil*_*il' 10

在 unix 模型中,启动另一个程序涉及两个原语:

  • fork()创建调用进程的(几乎)相同的副本。新进程称为子进程,原进程称为父进程。子进程运行与原进程相同的代码,拥有相同的权限,拥有相同的环境,并接收一份父进程的可变数据内存的副本。两个进程最明显的区别是它们有不同的进程ID和不同的父进程ID(子进程的PPID就是父进程的PID)。
  • execve()用从可执行文件加载的代码和数据替换当前进程的代码和数据。此系统调用将进程的新环境作为参数。

大多数高级函数围绕进程的当前环境构建fork()并将其execve()传递给execve(). 因此,除非进程改变自己的环境或execve()直接调用,否则被调用程序将继承调用程序的环境。

Shell 通常将它们的环境传递给它们调用的程序。您可以随时更改 shell 的环境,方法是为环境变量赋值(foo="some value"export foo如果变量不在环境中,则必须调用),或者通过取消设置从环境中删除变量 ( unset foo)。如果要启动具有不同或附加环境变量的外部程序,有一个快捷语法:

foo="some value" mycommand
Run Code Online (Sandbox Code Playgroud)

大致相当于

(foo="some value"; export foo; exec mycommand)
Run Code Online (Sandbox Code Playgroud)

(其中括号限制了 的设置范围foo)。


Mat*_*Mat 3

API 是指用于执行另一个进程的函数exec系列。C

一个进程启动另一个进程的典型顺序是,首先fork,然后在刚刚创建的子进程中调用其中一个exec函数。

在 和 之间forkexec在子进程中,可以在启动目标可执行文件之前更改环境。

并且execleexecvpe允许调用进程直接传入目标环境。

如果未使用execle和,并且在对子级的调用和子级中的调用execvpe之间没有修改环境,则应用正常规则。forkexec

shell 示例旨在向您展示如何更改 shell 子级的环境。如果 shell 没有使用上述一些“技巧”,它就不能让您这样做 - 所有子进程都将获得当前 shell 环境的精确副本。