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?

War es hilfreich?

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 der execvp() erfassen und diesen Wert in exit() verwenden, wie Sie vorgeschlagen. Ihr Kind Code sollte nie 0 zurück, da der einzige Erfolg bedeutet, dass die execvp 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ück status Parameter zu ziehen. Bemerkenswerte für Ihre Zwecke sind WIFEXITED, Ihnen zu sagen, wenn das Kind „normal“ beendet, und WEXITSTATUS des Kindes Status zu erhalten, wie exit() weitergegeben. Siehe die waitpid 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top