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はずなので、プロンプトを呼び出すべきではなく、親は子が死ぬまで待っています。
それで...私は何を間違っていますか?
ありがとう!!