繁体   English   中英

如何在shell中执行C程序中的C程序更改环境变量?

[英]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);

也许你开始明白,就内核而言,环境变量是第二组命令行参数 他们似乎可以通过getenvsetenv等独立访问,并且似乎从父对象继承,是由C库维护的错觉。

有关其工作原理的更多详细信息,请参阅x86-64 ELF ABI规范,第3.4.1节“初始堆栈和寄存器状态” ,特别注意图3.9,其中显示了由execve复制到新创建的堆栈上的数据的布局。 (链接的文档特定于一个CPU体系结构,但其工作方式在现代Unix中通常是一致的;精细细节当然会因CPU和CPU以及操作系统而异。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM