首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有关全局环境变量和fork() & exec()的问题

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

Unix & Linux用户
提问于 2018-12-18 19:10:32
回答 2查看 6.9K关注 0票数 0

我想了解的是子进程从其父进程中继承导出变量的位置

我想了解的是子进程从哪里继承导出的环境变量?我理解exec()系统调用覆盖了由fork()创建的环境变量.但是,如果所有环境变量都被覆盖,exec()如何使导出的环境变量包含在新创建的子进程中?我最好的猜测是导出的环境变量在某种程度上被排除在被覆盖之外.但我无法证实

编辑我的问题,使我的问题更清楚地与我的要求。

EN

回答 2

Unix & Linux用户

发布于 2018-12-18 20:50:20

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

  • fork不改变环境变量。
  • 没有exec后缀的e不会改变环境变量。
  • 带有exece后缀覆盖环境变量。

除了使用e post固定的execs来改变环境之外,您还可以这样做:

代码语言:javascript
运行
复制
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.
} …
票数 3
EN

Unix & Linux用户

发布于 2018-12-18 20:24:57

int execve(const *filename,char *const argv[],char *const envp[]);- 男子汉

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

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

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

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

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

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/489749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档