使用 execve 运行 PATH 环境中存在的可执行文件

Sau*_*wal 5 c posix

我正在用 C 编写一个简单的 shell。为了执行命令,shell 基本上会创建一个子进程,然后执行相同的子进程来运行该命令。

我使用 execve 函数如下:

execve(argList[0],argList,envList);
Run Code Online (Sandbox Code Playgroud)

这里 argList 和 envList 是 char*(string) 数组,具有以下值:

argList={"ls",NULL}
envList={"/bin",NULL}
Run Code Online (Sandbox Code Playgroud)

我认为由于ls作为 /bin 目录中的可执行文件存在,因此所需的 exec 应该具有与 ls 相同的效果(当然在 LINUX 系统上)。

但是,execve 命令无法对环境中目录中存在的可执行文件执行。

对于在当前工作目录中运行可执行文件来说,这同样适用。

我哪里错了?


结论:我错误地认为环境完全是别的东西。[抱歉:)] 环境数组负责为子进程设置环境。 因此,正如 Jim 所指出的,正确的过程是以以下格式设置环境变量:

envList = { "HOME=/root", PATH="/bin:/sbin", NULL }
Run Code Online (Sandbox Code Playgroud)

正如这里也解释的那样。

此外,为了使用 execve(而不是 execvp)实现上述结果,正如 Nemo 所解释的,我们总是可以重复调用 PATH 中的目录。如果文件不存在,execve 将失败。

Nem*_*emo 6

execve不搜索PATH。您需要使用execlp或类似的。有关详细信息,请参阅POSIX 参考。

在 Linux 上,您可能需要execvpe,但这是非标准的。

(此外,这些函数都不是标准 C 的一部分。您应该在问题中添加特定于平台的标签,例如“posix”或“linux”。)


Jim*_*ter 3

envList={"/bin",NULL}
Run Code Online (Sandbox Code Playgroud)

这是不正确的。envList为 -ed 程序提供环境字符串exec;它不是搜索列表或路径列表。正确的envList会更像

envList = { "HOME=/root", "PATH=/bin:/sbin", NULL }
Run Code Online (Sandbox Code Playgroud)