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
)。
API 是指用于执行另一个进程的函数exec
系列。C
一个进程启动另一个进程的典型顺序是,首先fork
,然后在刚刚创建的子进程中调用其中一个exec
函数。
在 和 之间fork
,exec
在子进程中,可以在启动目标可执行文件之前更改环境。
并且execle
还execvpe
允许调用进程直接传入目标环境。
如果未使用execle
和,并且在对子级的调用和子级中的调用execvpe
之间没有修改环境,则应用正常规则。fork
exec
shell 示例旨在向您展示如何更改 shell 子级的环境。如果 shell 没有使用上述一些“技巧”,它就不能让您这样做 - 所有子进程都将获得当前 shell 环境的精确副本。