我正在用 C 编写一个简单的 shell。要执行命令,shell 基本上会创建一个子进程,然后执行相同的命令来运行命令。
我正在使用函数 execve 如下:
execve(argList[0],argList,envList);
这里 argList 和 envList 是具有(比如说)以下值的 char*(string) 数组:
argList={"ls",NULL}
envList={"/bin",NULL}
我认为由于ls作为 /bin 目录中的可执行文件存在,因此所需的 exec 应该具有与 ls 相同的效果(当然在 LINUX 系统上)。
但是,execve 命令无法对环境中目录中存在的可执行文件执行。
这同样适用于在当前工作目录中运行可执行文件。
我哪里错了?
结论:我错误地认为环境完全是另外一回事。[道歉 :)] 环境数组负责为子进程设置环境。
因此,正如 Jim 所指出的,正确的过程是以以下格式设置环境变量:
envList = { "HOME=/root", PATH="/bin:/sbin", NULL }
在这里也有解释。
此外,为了使用 execve(而不是 execvp)实现上述结果,正如 Nemo 解释的那样,我们总是可以重复调用 PATH 中的目录。如果文件不存在,execve 将失败。