[英]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);
也許你開始明白,就內核而言,環境變量是第二組命令行參數 。 他們似乎可以通過getenv
和setenv
等獨立訪問,並且似乎從父對象繼承,是由C庫維護的錯覺。
有關其工作原理的更多詳細信息,請參閱x86-64 ELF ABI規范,第3.4.1節“初始堆棧和寄存器狀態” ,特別注意圖3.9,其中顯示了由execve
復制到新創建的堆棧上的數據的布局。 (鏈接的文檔特定於一個CPU體系結構,但其工作方式在現代Unix中通常是一致的;精細細節當然會因CPU和CPU以及操作系統而異。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.