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