关于全局环境变量和 fork() & exec() 的问题

关于全局环境变量和 fork() & exec() 的问题

我想要了解的是子进程在哪里继承父进程导出的变量

我想了解的是子进程从哪里继承导出的环境变量?我了解 exec() 系统调用会覆盖 fork() 创建的环境变量...但是,如果所有环境变量都被覆盖,那么 exec() 如何导致导出的环境变量包含在新创建的子进程中?我最好的猜测是导出的环境变量以某种方式排除在被覆盖之外......但我无法确认这一点

编辑我编辑了我的问题,以便更清楚地表达我的要求

答案1

没有全局环境变量。它们从父母传给孩子。

  • fork不改变环境变量。
  • exec没有e后修复不会更改环境变量。
  • exece修复覆盖环境变量。

除了使用e后置execs 来更改环境之外,您还可以执行以下操作:

int pid = fork() //new process with same environment variables
if (pid == 0) {
    putenv   //add some environment variables
    unsetenv //remove some environment variables
    exec     //replace program. non e version of exec.
} …

答案2

int execve(const char *filename, char *const argv[],
           char *const envp[]);

--人执行

envp参数提供全部执行程序的环境变量。如果您没有在 中传递任何值envp,则执行的程序将根本看不到任何环境变量。

当您读取环境变量 ( getenv()) 时,您总是从当前进程中读取它。

无法设置系统范围的环境变量。您只能配置初始进程的环境,设置要传递给子进程的变量。

原来如此可能的在完全不同的环境中启动另一个程序。但最广泛使用和最常见的约定是使用您自己的环境的副本来启动程序。如果需要,您可以修改特定的环境变量。

一个例外是su --loginsudo --login ...,它会干净地重置环境。省略--login这些命令的选项允许传递一些环境变量......这有时会导致“意外结果”。

相关内容