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

Fah*_*qui 2 c unix shell

我想改变的价值 PATHC 程序变量然后在运行此程序的 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;
}
Run Code Online (Sandbox Code Playgroud)

如果我sourceexec*系统调用中使用命令。PATH在 shell 中向后更新此变量的语法是什么?

zwo*_*wol 5

这是不可能的。子进程无法更改其父进程的环境变量。

要了解为什么这是不可能的,请查看签名execve

int execve(const char *program, char *const *argv, char *const *envp);
Run Code Online (Sandbox Code Playgroud)

它与Unix 系统上的真实签名配对main

int main(int argc, char **argv, char **envp);
Run Code Online (Sandbox Code Playgroud)

也许您开始明白,就内核而言,环境变量是第二组命令行参数。他们似乎是通过独立存取getenvsetenv等,并出现从父母继承来的孩子,是由C库维护的错觉。

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