Я запускаю простую программу оболочки из каталога:
/home/пользователь/shell.exe
Используя приведенный ниже код, я могу запускать файлы, находящиеся в той же папке, что и исполняемый файл оболочки, но не могу запускать такие программы, как ls.exe.
Контейнер маркеров включает имя файла в качестве первого элемента и любые последующие маркеры (например, "-l" во входных данных "ls.exe -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);
}
}
Я провел бесчисленное количество часов, просто гугля и читая справочные страницы снова и снова, но, похоже, не могу понять, почему этот код не работает.
Идея состоит в том, что моя программа оболочки должна позволять пользователям устанавливать переменную PATH, а затем выполнять программы с этой переменной PATH, поэтому я должен заставить execve() работать правильно, а не просто использовать execvp().
У меня есть карта переменных оболочки в отдельной части файла, но поскольку я даже не могу заставить это работать, я подумал, что было бы бессмысленно включать это.