У меня проблемы с fork () и тому подобными вещами.
Я разрабатываю оболочку, в которой пользователь может писать команды, которые будут выполняться как в обычной и обычной оболочке.
У меня есть такая основная функция:
void Shell::init() {
string command;
while (1) {
cout << getPrompt() << " ";
command = readCommand();
if (command.length() > 0) handleCommand(command);
}
}
handleCommand()
- это функция, которая делает практически все. Где-то в этом у меня есть следующее:
...
else {
pid_t pid;
pid = fork();
char* arg[tokens.size() + 1];
for (int i = 0; i < tokens.size(); ++i) {
arg[i] = (char*) tokens[i].c_str();
}
arg[tokens.size()] = NULL;
if (pid == 0) {
if (execvp(tokens[0].c_str(), arg) == -1) {
cout << "Command not known. " << endl;
};
} else {
wait();
}
}
Что я хочу, так это то, что когда я достигну этой точки, команда будет считаться вызовом программы, поэтому я создаю дочерний элемент для ее запуска. Он работает почти идеально, но я снова получаю подсказку перед выходом программы. Пример:
tronfi@orion:~/NetBeansProjects/Shell2$ whoami
tronfi@orion:~/NetBeansProjects/Shell2$ tronfi
tronfi@orion:~/NetBeansProjects/Shell2$
Ребенок должен умереть после execvp
, поэтому он не должен вызывать подсказку, и родитель ждет, пока ребенок не умрет.
Так ... что я делаю не так?
Спасибо !!