execve (…) не выполняет программу, несмотря на передачу переменной PATH

Я выполняю простую программу оболочки из каталога:

/home/user/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 ().

У меня есть карта переменных оболочки в отдельной части файла, но так как я даже не могу заставить это работать, я думал, что было бы бессмысленно включать это.

0

Решение

Вы делать знаю, что exec семейство функций заменяет текущий процесс с изображением новой программы? Вот почему так часто используется fork до exec,

Вооружившись этими знаниями, легко найти решение для вас, и как вы Можно использование execvp (который вам нужно использовать, execve на самом деле не использует среду, которую вы передаете, она просто передает ее новой программе): вы fork и использовать setenv установить PATH из новый процесс, прежде чем звонить execvp,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]