Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用execve运行PATH环境中的可执行文件_C_Posix - Fatal编程技术网

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

使用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相同的效果(当

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

我正在使用函数execve,如下所示:

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 }