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

时间:2013-01-12 05:27:20

标签: c posix

我正在用C写一个简单的shell。 要执行命令,shell基本上会创建一个子进程,然后 execs 运行该命令。

我正在使用函数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 }

也解释了here

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

2 个答案:

答案 0 :(得分:3)

execve不会搜索PATH。您需要使用execlp或类似内容。有关详细信息,请参阅the POSIX reference

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

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

答案 1 :(得分:2)

envList={"/bin",NULL}

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

envList = { "HOME=/root", PATH="/bin:/sbin", NULL }