为什么使用setenv()后环境variables未被设置

我在Linux中编写了一个C程序来使用setenv设置环境variables的值,但是在执行后,当我运行setexport ,环境variables本身似乎是未设置的。 为什么?

这里是代码片段:

 int main() { char *mallocPtr, *callocPtr, *reallocPtr, *memalignPtr, *vallocPtr; struct sigaction sa; sa.sa_handler=SIGSEGV_handler; sigaction(SIGSEGV, &sa, NULL); if(setenv("ENV1", "3", 1) == 0) printf("ENV1 set to 3\n"); else fprintf(stderr, "setenv failed on ENV1"); 

Solutions Collecting From Web of "为什么使用setenv()后环境variables未被设置"

环境变量是在程序的上下文中设置的。

当你的程序退出时,你回到程序启动的上下文中。

C库将环境变量视为可以用getenv读取的全局设置,并使用setenv / putenv调整,并通过调用exec系列来继承,但这是一个方便的小说。 就内核而言,环境变量是main的第二组参数 。 如果你看一下exec系列的实际系统调用execve ,这就变得清晰了。 这是它的C原型:

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

看到第三个参数? 这是进程A设置进程B的环境变量的唯一途径。 1因此,进程A可以设置进程B的环境变量的唯一时间是进程A通过forkexecve 启动进程B的时间。

你的程序是 shell启动的,所以shell需要设置它的环境变量的副本,但是没有办法把变化推回到shell – 就像C函数没有办法改变其调用者的参数值。

1不要调出ptrace

其实每个进程都有自己的envp char数组。 main功能有以下签名:

 int main(int argc, char *argv[], char *envp[]) 

通常,父类的父类继承父类父子层级。 这绝不是在父母子女等级中向上传达的。