我想改变的价值 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)
如果我source在exec*系统调用中使用命令。PATH在 shell 中向后更新此变量的语法是什么?
这是不可能的。子进程无法更改其父进程的环境变量。
要了解为什么这是不可能的,请查看签名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)
也许您开始明白,就内核而言,环境变量是第二组命令行参数。他们似乎是通过独立存取getenv和setenv等,并出现从父母继承来的孩子,是由C库维护的错觉。
有关其工作原理的更多详细信息,请研究x86-64 ELF ABI 规范,第 3.4.1 节“初始堆栈和寄存器状态”,特别注意图 3.9,其中显示了复制execve到新创建的堆栈上的数据的布局。(链接的文档特定于一种 CPU 架构,但其工作方式在现代 Unix 中通常是一致的;细节当然会因 CPU 和操作系统而异。)
| 归档时间: |
|
| 查看次数: |
262 次 |
| 最近记录: |