Does waitpid für ein Kind Prozess gültige Statusinformationen erhalten, die bereits verlassen hat?

StackOverflow https://stackoverflow.com/questions/2865640

  •  30-09-2019
  •  | 
  •  

Frage

Wenn ich ein Kind-Prozess, und das Kind Prozess beendet wird, bevor die Mutter Anrufe fork waitpid, dann ist der Ausgang Statusinformationen, die von waitpid gesetzt ist noch gültig? Wenn ja, wann wird es nicht gültig ist; dh, wie stelle ich sicher, dass ich waitpid auf dem Kind pid anrufen kann und weiterhin gültig Exit-Status-Informationen nach einer beliebigen Menge von Zeit zu bekommen, und wie kann ich „clean up“ (das O sagt, dass ich kein Interesse mehr an den Exit-Statusinformationen für den fertigen Kind-Prozess)?

Ich spiele mit dem folgenden Code um, und es scheint, dass die Exit-Status Information gilt für mindestens ein paar Sekunden, nachdem das Kind abgeschlossen ist, aber ich weiß nicht, wie lange oder wie das Betriebssystem zu informieren, dass ich gewonnen ‚t waitpid anrufen wieder:

#include <assert.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    pid_t pid = fork();

    if (pid < 0) {
        fprintf(stderr, "Failed to fork\n");
        return EXIT_FAILURE;
    }
    else if (pid == 0) { // code for child process
        _exit(17);
    }
    else { // code for parent
        sleep(3);

        int status;
        waitpid(pid, &status, 0);
        waitpid(pid, &status, 0); // call `waitpid` again just to see if the first call had an effect
        assert(WIFEXITED(status));
        assert(WEXITSTATUS(status) == 17);
    }

    return EXIT_SUCCESS;
}
War es hilfreich?

Lösung

Ja, waitpid funktionieren wird, nachdem das Kind verlassen hat. Das Betriebssystem wird ein Kind Prozess Eintrag in der Prozesstabelle (einschließlich Exit-Status) hält herum, bis die Eltern rufen waitpid (oder eine andere wait-Familie Funktion) oder bis den Eltern Ausgänge (an welchem ??Punkt des Status wird durch den init Prozess gesammelt) . Dies ist, was ein „Zombie“ Prozess ist. Ein Prozess, der ist genau zu diesem Zweck in der Prozesstabelle resident durch noch verlassen hat

Der Prozess Eintrag in der Tabelle soll nach dem ersten Aufruf zu waitpid weggehen. Ich vermute, dass der Grund, dass Sie in Ihrem Beispiel scheinen waitpid zweimal in der Lage sein zu nennen, ist einfach, weil waitpid nicht das status Argument ändern, wenn pid nicht mehr existiert. So sollte der erste Anruf in status arbeitet und füllt und der zweite Aufruf sollte einen Fehlercode zurückkommen und nicht status ändern. Sie können dies überprüfen, indem Sie die Rückgabewerte der waitpid Anrufe Inspektion und / oder zwei verschiedene status Variablen.

Andere Tipps

Das Betriebssystem hält beendet Prozess in einem Zombie-Zustand , bis seine Eltern (die sein könnten init wenn die ursprüngliche übergeordnete Prozess beendet früher) sammelt, dass Exit-Status mit wait(2) Systemaufruf. Die Antwort ist also -. Der Exit-Status des Prozesses wird nicht ungültig

Ja.

Von der Manpage :

  

Ein Kind, das endet, hat aber nicht   gewartet worden wird für einen „Zombie“.   Der Kernel verwaltet einen minimalen Satz von   Informationen über den Zombie-Prozess   (PID, Beendigungsstatus, Ressourcen   Nutzungsinformationen), um zu ermöglichen,   die Mutter auszuführen später Wartezeit zu   erhalten Informationen über das Kind.

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