尽管传入了 PATH 变量,但 execve(...) 不执行程序

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.

之前的新 进程