J'ai des problèmes avec fork() et ce genre de choses.Fork(): Ne pas revenir de l'enfant jusqu'à ce qu'il soit terminé
Je développe un shell, où l'utilisateur peut écrire des commandes qui seront exécutées comme dans un shell normal et commun.
J'ai une fonction principale comme ceci:
void Shell::init() {
string command;
while (1) {
cout << getPrompt() << " ";
command = readCommand();
if (command.length() > 0) handleCommand(command);
}
}
handleCommand()
est la fonction qui fait à peu près tout. Quelque part dans, je donne les résultats suivants:
...
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();
}
}
Ce que je veux est que quand j'atteins ce moment-là, la commande sera traitée comme un appel de programme, donc je crée un enfant pour l'exécuter. Cela fonctionne presque parfait, mais je reçois l'invite à nouveau avant la sortie du programme. Exemple:
[email protected]:~/NetBeansProjects/Shell2$ whoami
[email protected]:~/NetBeansProjects/Shell2$ tronfi
[email protected]:~/NetBeansProjects/Shell2$
L'enfant doit mourir après la execvp
, donc il ne faut pas appeler l'invite, et le parent attend jusqu'à ce que la matrice de l'enfant.
Alors ... qu'est-ce que je fais mal?
Merci!
Je ne pense pas que ce soit précisément votre problème, mais considérons ce qui se passe si 'execvp()' échoue. Combien d'instances de votre coquille auriez-vous à ce moment-là? –
Je pense que le titre de cette question va déclencher ma crise de mi-vie ... – David
Ok Greg, je suppose que je devrais avoir à tuer l'enfant du parent. Ai-je tort? –