3

我正在用 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 将失败。

4

2 回答 2

3

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

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

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

于 2013-01-12T05:30:11.323 回答
2
envList={"/bin",NULL}

这是不正确的。envList 为execed 程序提供环境字符串;它不是一个搜索列表。一个正确的 envList 会更像

envList = { "HOME=/root", PATH="/bin:/sbin", NULL }
于 2013-01-12T06:07:05.580 回答