Wie wollen Sie töten zombie-Prozess mittels wait()
Habe ich diesen code erfordert, dass ein Elternteil zu Gabel 3 Kinder.
-
Woher wissen Sie, (und) wo die "wait()" Anweisung zu töten
zombie-Prozesse? -
Was ist der Befehl, um zombie-Prozesse wenn Sie Linux
virtual box?main(){ pid_t child; printf("-----------------------------------\n"); about("Parent"); printf("Now .. Forking !!\n"); child = fork(); int i=0; for (i=0; i<3; i++){ if (child < 0) { perror ("Unable to fork"); break; } else if (child == 0){ printf ("creating child #%d\n", (i+1)); about ("Child"); break; } else{ child = fork(); } } } void about(char * msg){ pid_t me; pid_t oldone; me = getpid(); oldone = getppid(); printf("***[%s] PID = %d PPID = %d.\n", msg, me, oldone); }
Wenn ich davon ausgehen - ich würde warten, (3) nach dem child=fork() im else-Anweisung. Ich bin zwar nicht fließend mit zombie-Prozesse oder linux, so bin ich mir auch nicht sicher, wie Sie Sie anzeigen, die zombie-Prozesse
InformationsquelleAutor mudwomp | 2015-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihre Eltern laicht nur eine kleine, Feste Anzahl von Kindern, egal ist, Wann oder ob Sie anhalten, fortsetzen oder beenden; und selbst beendet schnell, dann brauchen Sie nicht zu verwenden
wait()
oderwaitpid()
zu bereinigen, die Kind-Prozesse. Der init-Prozess (pid 1) übernimmt die Verantwortung für das verwaiste Kind-Prozesse, und reinigen Sie Sie, wenn Sie fertig stellen.Unter anderen Umständen, Sie müssen jedoch
wait()
für child-Prozesse. Dabei schafft Ressourcen, sorgt dafür, dass das Kind beendet hat, und ermöglicht es Ihnen, zu erhalten, das Kind der exit-status. Überwaitpid()
Sie können auch benachrichtigt werden, wenn ein Kind ist angehalten, wieder aufgenommen oder durch ein signal, wenn Sie so wollen.Als für wo zu führen, die warten,
wait()
s.waitpid(-1, NULL, WNOHANG)
zu sammeln, das zombie-Kind, wenn es einer ist, ohne zu blockieren, wenn es keine gibt.Insbesondere müssen Sie nicht
wait()
(unbedingt) sofort nachfork()
ing, weil Eltern und Kind führen Sie den gleichen code. Sie müssen mit der return-Wert vonfork()
um zu bestimmen, ob Sie in das Kind (Rückgabewert == 0) oder in der übergeordneten (alle anderen return-Wert). Des weiteren muss die übergeordnetewait()
nur, wenn die Verzweigung erfolgreich war, in dem Fallfork()
gibt dem Kind die pid, die ist immer größer als null. Ein Rückgabewert kleiner als null gibt an, Fehler zu Gabel.Des Programms nicht wirklich brauchen, um
wait()
denn es erzeugt genau vier (nicht drei) die Kinder, die dann beendet. Allerdings, wenn Sie wollte, die Eltern haben am meisten ein lebendiges Kind zu jeder Zeit, dann könnten Sie schreiben es so:Wenn der parent beendet, bevor eine oder mehrere seiner Kinder, die passieren können, wenn er nicht warten, dann wird das Kind danach sehen übergeordneten Prozess pid 1.
Andere haben schon geantwortet, wie man einen zombie-Prozess-Liste, über th
ps
Befehl. Sie können auch in der Lage, um zu sehen, zombies übertop
. Mit deinem ursprünglichen code werden Sie kaum einen flüchtigen Eindruck von zombies, aber, weil der übergeordnete Prozess beendet, sehr schnell, undinit
wird dann reinigen Sie die zombies, die es hinterlässt.InformationsquelleAutor John Bollinger
Können Sie
wait()
überall in der parent-Prozess, und wenn der untergeordnete Prozess beendet wird, es wird aus dem system entfernt werden. Wo ist es an Ihnen, in Ihrem speziellen Fall werden Sie wahrscheinlich wollen, um es sofort nach derchild = fork();
Linie, so dass der übergeordnete Prozess nicht wieder seine Ausführung so lange, bis Ihr Kind beendet wurde.Können Sie die
ps aux
- Befehl, um alle Prozesse im system (einschließlich zombie-Prozesse), und dieSTAT
Spalte wird gleichZ
wenn der Prozess ein zombie ist. Ein Beispiel für die Ausgabe wäre:wait()
, wenn spamming kompilieren, ich sehe, dass manchmal bekomme ich eine 1 für PPID anstelle der PID der Eltern. Mit derwait(5)
innerhalb der übergeordneten Funktion, sehe ich nicht ein. Heißt das, dass diewait(5)
innerhalb der Funktion ist, loszuwerden, zombie-Prozesse?Auch, wenn ich
ps aux
ich am Ende gehen auf der Linie(?)26433 tc
. Es nur spamstc
alle dem Weg nach unten, also bin ich nicht sicher, wo um zu schauen.Vorausgesetzt Sie haben die zombie-Prozesse, führen Sie
ps aux | grep Z
anzeigen nur die Zeilen mitZ
(wenn das Programm beendet seine Ausführung dann diese nicht zeigen, dass Sie alles, was relevant ist, als all die zombie-Kinder wurden aus dem system entfernt). Wie bei Ihrer ersten Frage, was passiert, ist, dass Ihr Kind-Prozess ausgeführt wird nachdem der parent-Prozess beendet wurde, damit seine Eltern jetzt dieinit
Prozess ist, derpid == 1
. Durch den Aufrufwait
Sie verhindern, dass der übergeordnete Prozess zu verlassen, bis wenigstens eines seiner Kinder beendet seine Ausführung.InformationsquelleAutor Daniel Kleinstein
Registrieren Sie einen signal-handler für SIGCHLD, setzt einen globalen
volatile sig_atomic_t flag = 0
variable auf 1 gesetzt. Dann, auf einige günstiger Ort in Ihrem Programm, zu testen, obflag
auf 1 festgelegt ist, und, wenn ja, setze es zurück auf 0 und danach (für sonst verpassen Sie vielleicht ein signal) Aufrufwaitpid(-1, NULL, WNOHANG)
in einer Schleife, bis es Ihnen sagt, dass nicht mehr Prozesse gewartet werden. Beachten Sie, dass das signal interrupt-system fordert, mit EINTR, das ist eine gute Voraussetzung, um zu überprüfen für Sie den Wert vonflag
. Wenn Sie ein auf unbestimmte Zeit Blockier-system aufrufen, wieselect()
, möchten Sie vielleicht, um eine Zeit angeben, nach denen Sie überprüfen, fürflag
, da sonst verpassen Sie vielleicht ein signal, das aufgezogen wurde, nach Ihrer letztenwaitpid()
rufen, aber bevor Sie in die auf unbestimmte Zeit Blockier-system nennen. Eine alternative zu diesem Schlamassel ist die Verwendungpselect()
.InformationsquelleAutor rtc