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

时间:2014-04-20 13:41:42

标签: c shell unix

我想在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变量的语法是什么?

1 个答案:

答案 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);

也许您开始明白,就内核而言,环境变量是第二组命令行参数。他们出现可通过getenvsetenv等单独访问,而似乎从父级继承到子级,这是一种由C库。

有关其工作原理的更多详细信息,请研究the x86-64 ELF ABI specification, section 3.4.1 "Initial Stack and Register State",特别注意图3.9,其中显示了由execve复制到新创建的堆栈上的数据的布局。 (链接的文档特定于一个CPU体系结构,但其工作方式在现代Unix中通常是一致的;精细细节当然会因CPU和CPU以及操作系统而异。)