【发布时间】:2017-10-20 18:30:04
【问题描述】:
我正在从目录中执行一个简单的 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 变量映射,但由于我什至无法让它工作,我认为包含它是没有意义的。
【问题讨论】: