execve(..) 不执行程序,尽管传入了 PATH 变量
execve(...) does not execute program despite passing in PATH variable
我正在从目录中执行一个简单的shell程序:
/home/user/shell.exe
使用下面的代码,我可以运行与我的 shell 可执行文件位于同一文件夹中的文件,但无法运行 ls.exe 等程序。
令牌容器包括文件名作为第一个元素,并在以下元素中包含任何后续标记(例如输入"ls.exe-l"中的"-l")。
if (fork())
{
int status;
wait(&status);
}
else
{
std::vector<const char*> exeArgs;
std::vector<const char*> envArgs;
std::for_each(tokens.begin(), tokens.end(),
[&exeArgs](const string& elem){ exeArgs.push_back(elem.c_str()); }
);
exeArgs.push_back(nullptr);
string path = "PATH=";
path.append(getenv("PATH"));
envArgs.push_back(path.c_str());
envArgs.push_back(nullptr);
if (execve(exeArgs[0], const_cast<char *const *>(&exeArgs[0]),
const_cast<char *const *>(&envArgs[0])))
{
std::cout << word << ": command not found" << std::endl;
exit(0);
}
}
我花了无数个小时一遍又一遍地谷歌搜索和阅读手册页,但似乎不知道为什么这段代码不起作用。
这个想法是我的 shell 程序应该允许用户设置 PATH 变量,然后使用该 PATH 变量执行程序,这就是为什么我必须使 execve() 正常工作,而不仅仅是使用 execvp()。
我在文件的单独部分有一个 shell 变量映射,但由于我什至无法让它工作,我认为包含它是没有意义的。
您知道exec
系列函数用新程序的图像替换了当前进程吗?这就是为什么在exec
之前使用fork
如此普遍的原因。
有了这些知识,就很容易找到适合您的解决方案,以及如何使用execvp
(您需要使用,execve
并没有真正使用您传递的环境,它只是将其传递给新程序): 您fork
并使用setenv
来设置新流程的PATH
, 在打电话之前execvp
.
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 当InProcServer32键定义DLL的完整路径时,path环境变量中为什么需要COM DLL的路径
- execve(..) 不执行程序,尽管传入了 PATH 变量
- 需要有关 PATH 变量的帮助
- 通过 PATH 环境启动程序.具有正确工作目录的变量
- 使用 QProcessEnvironment 更改 cmd.exe 的 PATH 环境变量
- 除了更改环境变量"PATH"之外,您还需要做什么才能让 Eclipse 识别 MinGW?
- 设置PATH变量无效
- 如何使用QT设置PATH变量
- 如何在安装MinGW (Windows 32位)时设置环境变量PATH
- Qt创建者修改PATH环境变量
- make/cc 找不到头文件,即使它的目录存在于 PATH 变量中
- 如何查找已安装的MinGW GCC编译器的PATH变量