我在 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
,所以它不应该调用提示,并且父母正在等到孩子死亡。
所以......我做错了什么?
谢谢!!