簡體   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