我想在C程序中更改PATH
变量的值,然后在shell中查看我运行此程序的更改值。
做这样的事,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main () {
char *path = getenv ("PATH");
printf ("%s\n\n", path);
setenv ("PATH", strcat (path, ":~/myNewPath/"), 1);
printf ("%s\n\n", path);
int pid = fork ();
if (pid == -1)
abort ();
if (pid == 0) {
} else {
// use execlp? how? source? any hints?
}
return 0;
}
如果我在source
系统调用中使用exec*
命令。在shell中向后更新此PATH
变量的语法是什么?
答案 0 :(得分:3)
这是不可能的。子进程无法更改其父级的环境变量。
要理解为什么是不可能的,请查看execve
的签名
int execve(const char *program, char *const *argv, char *const *envp);
与Unix系统上main
的 true 签名配对
int main(int argc, char **argv, char **envp);
也许您开始明白,就内核而言,环境变量是第二组命令行参数。他们出现可通过getenv
和setenv
等单独访问,而似乎从父级继承到子级,这是一种由C库。
有关其工作原理的更多详细信息,请研究the x86-64 ELF ABI specification, section 3.4.1 "Initial Stack and Register State",特别注意图3.9,其中显示了由execve
复制到新创建的堆栈上的数据的布局。 (链接的文档特定于一个CPU体系结构,但其工作方式在现代Unix中通常是一致的;精细细节当然会因CPU和CPU以及操作系统而异。)