Wie ein Kind Prozess beenden und seinen Status von execvp zurückkehren ()?
Frage
In meiner einfach benutzerdefiniert Shell lese ich Befehle von der Standardeingabe und führe sie mit execvp (). Vor diesem habe ich eine Gabel des aktuellen Prozesses erstellen, und ich rufe die execvp () in diesem Kind-Prozess, gleich danach, ich Abfahrt anrufen (0).
So etwas wie folgt aus:
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...
}
Nun werden die Befehle mit execvp run () können Fehler direkt zurückgeben? Ich mag, dass richtig zu handhaben und gerade jetzt, ich bin immer der Aufruf von exit (0), die das Kind Prozess bedeutet immer einen „OK“ Zustand hat.
Wie kann ich den richtigen Status der execvp zurückkehren () aufrufen und in den Ausgang setzen () aufrufen? Sollte ich nur den int-Wert, der execvp () zurückkehrt und übergeben ihn als Exit () Argument statt 0. Ist das genug und richtig?
Lösung
Sie müssen waitpid(3)
oder wait(1)
in dem übergeordneten Code verwenden, für das Kind zu warten, um die Fehlermeldung zu beenden und erhalten.
Die Syntax ist:
pid_t waitpid(pid_t pid, int *status, int options);
oder
pid_t wait(int *status);
status
enthält den Exit-Status. Schauen Sie sich die Manpages zu sehen, wie es zu analysieren.
Beachten Sie, dass diese von dem Kind Prozess nicht tun können. Sobald Sie execvp
das Kind Prozess nennen stirbt (für alle praktischen Zwecke) und ist ersetzt durch den exec
'd Prozess. Die einzige Möglichkeit, exit(0)
erreichen wird, wenn execvp
selbst ausfällt, dann aber der Fehler ist nicht, weil das neue Programm beendet. Es ist, weil es nie zu beginnen lief.
Edit: der Kindprozess nicht wirklich sterben. Die PID und Umwelt bleiben unverändert, aber der gesamte Code und die Daten werden mit dem exec
'd Prozess ersetzt. Sie können auf zählen nicht auf die ursprüngliche Kindprozess zurückkehren, es sei denn, exec
ausfällt.
Andere Tipps
Aus Ihrer Frage ist es ein wenig schwer, herauszufinden, was Sie fragen. Also werde ich versuchen, ein paar der Fragen abdecken:
-
execvp()
entweder nicht zurück (auf Erfolg), oder es gibt einen Fehler zurück. Bedeutung Ihr Kind Code benötigen nur Fehlerbedingungen behandeln. Ihr Kind Code sollte das Ergebnis derexecvp()
erfassen und diesen Wert inexit()
verwenden, wie Sie vorgeschlagen. Ihr Kind Code sollte nie 0 zurück, da der einzige Erfolg bedeutet, dass dieexecvp
gearbeitet und , die wird processs 0 zurück (oder nicht). - Die Eltern können Kind Infos von
waitpid()
erhalten darüber Exit-Status ist. Es gibt mehrere Makros definiert Informationen aus dem zurückstatus
Parameter zu ziehen. Bemerkenswerte für Ihre Zwecke sindWIFEXITED
, Ihnen zu sagen, wenn das Kind „normal“ beendet, undWEXITSTATUS
des Kindes Status zu erhalten, wieexit()
weitergegeben. Siehe diewaitpid
Manpage für andere Makros.
Verwenden wait()
oder waitpid()
in dem übergeordneten Prozess. Ein Beispiel hier: Code zurück, wenn OS Ihren Prozess töten .
Auch wenn ein Kind das SIGCHLD
Signal stirbt an den übergeordneten Prozess gesendet.