Я пытаюсь создать простую оболочку. Вот что я сделал до сих пор:
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
#include <string>
#include <vector>
#include <sstream>
void execute(std::vector<char *> instructions)
{
auto pid = fork();
int status;
if (pid < 0) {
std::cout << "Fork error occured!" << std::endl;
exit(1);
} else if (pid == 0) {
if(execvp(instructions[0], instructions.data()) < 0) {
std::cout << "Command Not Found" << std::endl;
exit(1);
}
} else {
while (wait(&status) != pid);
}
}
std::vector<char *> splitter(std::string input)
{
std::istringstream iss(input);
std::vector<std::string> tokens{std::istream_iterator<std::string>{iss},
std::istream_iterator<std::string>{}};
std::vector<char *> instructions(tokens.size());
for (auto i = 0; i != tokens.size(); ++i) {
instructions[i] = &tokens[i][0];
}
return instructions;
}
int main()
{
std::string input;
while (1) {
std::cout << "[cmd]:";
getline(std::cin, input);
if (input == "exit") exit(0);
std::vector<char *> instructions = splitter(input);
execute(instructions);
}
return 0;
}
Когда я запускаю код и несколько раз ввожу «ls», я получаю разные результаты:
[cmd]:ls
Assignment IV
[cmd]:ls
Command Not Found
[cmd]:ls
Assignment IV
[cmd]:ls
Assignment IV
[cmd]:ls
Command Not Found
[cmd]:pwd
/Users/diveafall/Library/Developer/Xcode/DerivedData/Assignment_IV-grxcoesjdabjvoenxkaprouhexuh/Build/Products/Debug
[cmd]:
Я понятия не имею, почему это происходит. Я полагаю, что моя функция разделения строк далека от идеальной. Можете ли вы помочь мне исправить это? Кроме того, если у вас есть какие-либо советы, пожалуйста, не стесняйтесь их давать. Я нуб и буду признателен за любую помощь. Спасибо.
Задача ещё не решена.
Других решений пока нет …