Does waitpid für ein Kind Prozess gültige Statusinformationen erhalten, die bereits verlassen hat?
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;
}
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.