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之间没有修改环境,则应用正常规则。forkexec
shell 示例旨在向您展示如何更改 shell 子级的环境。如果 shell 没有使用上述一些“技巧”,它就不能让您这样做 - 所有子进程都将获得当前 shell 环境的精确副本。
| 归档时间: |
|
| 查看次数: |
14177 次 |
| 最近记录: |