我正在用C语言编写一个简单的shell。为了执行一个命令,shell需要创建一个子进程,然后使用exec函数来运行该命令。
我正在使用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将失败。
PATH
的每个元素添加到文件名的前面,然后一遍又一遍地尝试execve
,那应该可以解决问题...execve
使用完整的文件名作为第一个参数。如果文件名不以/
开头,则会相对于当前工作目录进行查找;execve
不会搜索PATH
。 - Nemo