首页 > 解决方案 > 更改以 execve() 开始的子进程的当前目录

问题描述

我想更改子进程的环境变量,execve()以便如果子进程在当前目录中打开一个文件,它会链接到另一个目录。我必须更改什么环境变量才能完成此任务?$PWD不管用。

例如:

char *args[] = { .... };
char *env[] = { "PWD=/home/anydirectory_I_Wish", NULL };
execve( mycode, args, env);

标签: clinuxenvironment-variables

解决方案


没有环境变量可以做到这一点。

类似foobar/foo传递给系统调用的open(2)相对路径名总是相对于当前工作目录(cwd) 进行解析。cwd 是进程的一个属性,只能通过系统调用chdirfchdir(可能还有一些我遗漏的其他模糊方式)来更改。但PWD在解析相对路径名时,既不使用也不使用任何其他环境变量。

将环境变量设置PWD为与 cwd 的名称相同的想法是 shell 的一个特性,以方便脚本访问它。其他程序不一定需要以PWD任何特殊方式处理,或者在 cwd 更改时对其进行更新。特别是,操作系统不保证PWD将在任何任意程序中设置为 cwd 的名称。


推荐阅读