使用execve运行PATH环境中的可执行文件
我正在用C写一个简单的shell。 为了执行命令,shell基本上创建一个子进程,然后执行相同的子进程来运行命令 我正在使用函数execve,如下所示:使用execve运行PATH环境中的可执行文件,c,posix,C,Posix,我正在用C写一个简单的shell。 为了执行命令,shell基本上创建一个子进程,然后执行相同的子进程来运行命令 我正在使用函数execve,如下所示: execve(argList[0],argList,envList); 这里argList和envList是char*(字符串)数组,具有(比如)以下值: argList={"ls",NULL} envList={"/bin",NULL} 我认为,由于ls在/bin目录中作为一个可执行文件存在,所以所需的exec应该具有与ls相同的效果(当
execve(argList[0],argList,envList);
这里argList和envList是char*(字符串)数组,具有(比如)以下值:
argList={"ls",NULL}
envList={"/bin",NULL}
我认为,由于ls在/bin目录中作为一个可执行文件存在,所以所需的exec应该具有与ls相同的效果(当然是在LINUX系统上)
但是,execve命令无法对环境中目录中的可执行文件执行
这同样适用于在当前工作目录中运行可执行文件
我哪里做错了
结论:我误认为环境完全是另一回事。[抱歉:)] 环境数组负责设置子进程的环境 因此,正如Jim所指出的,正确的程序是按照以下格式设置环境变量:
envList = { "HOME=/root", PATH="/bin:/sbin", NULL }
这也解释了
此外,为了使用execve(而不是execvp)实现上述结果,
正如尼莫所解释的,我们总是可以重复调用路径中的目录。如果文件不存在,execve将失败
execve
不搜索路径
。您需要使用execlp
或类似工具。有关详细信息,请参阅
在Linux上,您可能需要execvpe
,但这是非标准的
(此外,这些函数都不是标准C的一部分。您应该在问题中添加特定于平台的标记,如“posix”或“linux”。)
这是不正确的。envList为exec
ed程序提供环境字符串;它不是一个搜索列表。正确的环境列表更像
envList = { "HOME=/root", PATH="/bin:/sbin", NULL }
谢谢你的回答。我尝试过使用execlp,它确实有效。但是,为了理解,我还想尝试使用execve执行同样的操作。因此,我首先使用getenv(“PATH”)获取环境,然后将路径拆分为不同的目录,并将其存储在array envList中。据我所知,这个命令应该查看这些路径目录中的每一个,并在其中任何一个目录中运行可执行文件。注意:我怀疑这可能与execve的第一个参数是文件名而不是路径有关。但我还不确定。如果您手动将
PATH
的每个元素预先添加到文件名,然后反复尝试execve
,应该可以execve
使用完整文件名作为第一个参数。如果文件名不以/
开头,则将相对于当前工作目录进行查找execve
只是不搜索路径
@SaurabhAgarwal envlist不起任何类似的作用。。。它为已执行的程序提供环境字符串
envList = { "HOME=/root", PATH="/bin:/sbin", NULL }