Comment sortir d'un processus enfant et retourner son statut de execvp ()?
Question
Dans mon simple shell personnalisé Je lis des commandes à partir de l'entrée standard et les exécuter avec execvp (). Avant cela, je crée une fourchette du processus en cours et je l'appelle execvp () dans ce processus d'enfant, juste après, je l'appelle la sortie (0).
Quelque chose comme ceci:
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
if(pid == 0) {
// CHILD PROCESS CODE GOES HERE...
execvp(pArgs[0], pArgs);
exit(0);
} else {
// PARENT PROCESS CODE GOES HERE...
}
Maintenant, les commandes sont exécutées avec execvp () peut retourner des erreurs droite? Je veux gérer cela correctement et en ce moment, j'appelle toujours la sortie (0), ce qui signifie que le processus enfant aura toujours un état « OK ».
Comment puis-je retourner le statut propre de la execvp () appeler et le mettre dans la sortie () appeler? Devrais-je obtenir la valeur int que les rendements execvp () et le transmettre comme argument exit () au lieu de 0. Est-ce suffisant et correct?
La solution
Vous devez utiliser waitpid(3)
ou wait(1)
dans le code parent d'attendre l'enfant pour quitter et faire passer le message d'erreur.
La syntaxe est:
pid_t waitpid(pid_t pid, int *status, int options);
ou
pid_t wait(int *status);
status
contient l'état de sortie. Regardez l'homme rel="noreferrer"> pages vous voir comment l'analyser.
Notez que vous ne pouvez pas le faire à partir du processus enfant. Une fois que vous appelez execvp
le processus enfant meurt (à toutes fins pratiques) et est remplacé par le processus exec
'd. La seule façon que vous pouvez atteindre exit(0)
il est si execvp
échoue lui-même, mais l'échec est pas parce que le nouveau programme a pris fin. C'est parce qu'il n'a jamais couru pour commencer.
Modifier le processus de l'enfant n'a pas vraiment mourir. Le PID et l'environnement demeurent inchangés, mais tout le code et les données sont remplacées par le processus exec
'd. Vous pouvez compter sur pas retour au processus de l'enfant d'origine, à moins que exec
échoue.
Autres conseils
A partir de votre question, il est un peu difficile de comprendre ce que vous demandez. Je vais donc essayer de couvrir quelques questions liées:
-
execvp()
soit ne retourne pas (en cas de succès), ou renvoie une erreur. Signification du code de l'enfant ne doivent gérer les conditions d'erreur. Votre code d'enfant doit saisir le résultat deexecvp()
et d'utiliser cette valeur dansexit()
comme vous le suggérez. Votre code enfant ne devrait jamais revenir 0, car le seul succès signifie que leexecvp
a travaillé et que traitee retourne 0 (ou non). - Le parent peut obtenir les informations des enfants à partir
waitpid()
au sujet de son statut de sortie. Il y a plusieurs macros définies pour tirer les informations du paramètrestatus
retourné. Notable à vos besoins sontWIFEXITED
de vous dire si l'enfant a quitté « normalement », etWEXITSTATUS
pour obtenir le statut de l'enfant est passé àexit()
. Voir la page de manuelwaitpid
pour d'autres macros.
Utilisation wait()
ou waitpid()
dans le processus parent. Un exemple ici: Retour code lorsque OS tue votre processus .
En outre, lorsqu'un enfant meurt le signal de SIGCHLD
est envoyé au processus parent.