我正在用 C 编写一个简单的 shell。为了执行命令,shell 基本上会创建一个子进程,然后执行相同的子进程来运行该命令。
我使用 execve 函数如下:
execve(argList[0],argList,envList);
Run Code Online (Sandbox Code Playgroud)
这里 argList 和 envList 是 char*(string) 数组,具有以下值:
argList={"ls",NULL}
envList={"/bin",NULL}
Run Code Online (Sandbox Code Playgroud)
我认为由于ls作为 /bin 目录中的可执行文件存在,因此所需的 exec 应该具有与 ls 相同的效果(当然在 LINUX 系统上)。
但是,execve 命令无法对环境中目录中存在的可执行文件执行。
对于在当前工作目录中运行可执行文件来说,这同样适用。
我哪里错了?
结论:我错误地认为环境完全是别的东西。[抱歉:)] 环境数组负责为子进程设置环境。
因此,正如 Jim 所指出的,正确的过程是以以下格式设置环境变量:
envList = { "HOME=/root", PATH="/bin:/sbin", NULL }
Run Code Online (Sandbox Code Playgroud)
正如这里也解释的那样。
此外,为了使用 execve(而不是 execvp)实现上述结果,正如 Nemo 所解释的,我们总是可以重复调用 PATH 中的目录。如果文件不存在,execve 将失败。
envList={"/bin",NULL}
Run Code Online (Sandbox Code Playgroud)
这是不正确的。envList为 -ed 程序提供环境字符串exec;它不是搜索列表或路径列表。正确的envList会更像
envList = { "HOME=/root", "PATH=/bin:/sbin", NULL }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8398 次 |
| 最近记录: |