[英]How to change environment variable in shell executing a C program from that C program?
我想在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;
}
如果我在exec*
系统调用中使用source
命令。 在shell中向后更新此PATH
变量的语法是什么?
这是不可能的。 子进程无法更改其父级的环境变量。
要理解为什么不可能,请查看execve
的签名
int execve(const char *program, char *const *argv, char *const *envp);
这与Unix系统上的main
的真正签名配对
int main(int argc, char **argv, char **envp);
也许你开始明白,就内核而言,环境变量是第二组命令行参数 。 他们似乎可以通过getenv
和setenv
等独立访问,并且似乎从父对象继承,是由C库维护的错觉。
有关其工作原理的更多详细信息,请参阅x86-64 ELF ABI规范,第3.4.1节“初始堆栈和寄存器状态” ,特别注意图3.9,其中显示了由execve
复制到新创建的堆栈上的数据的布局。 (链接的文档特定于一个CPU体系结构,但其工作方式在现代Unix中通常是一致的;精细细节当然会因CPU和CPU以及操作系统而异。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.