Frage

habe ich die PID eines Prozesses und ich muss überprüfen, ob es ein Zombie in C unter Verwendung von POSIX-System ruft Wie soll ich das tun?

Das Problem, das ich habe ist, dass ich einen Prozess haben und es in viele Kinder Gabeln, die Kinder alle tun execs und manchmal möchte ich die exec im Hintergrund tun, so kann ich nicht wirklich warten () die Kinder, die gehen im Hintergrund. Ich konnte warten () regelmäßig (einmal in meiner Hauptschleife), aber ich muß wissen, welche Prozesse Zombie ist so mein Vater Prozess nicht hängen, während für die Kinder warten, die nicht bald zu Ende gehen wird.

Wenn Sie neugierig sind, ich bin ein Shell-Unix-Aufbau, und es ist in der Schale der Natur, die Kinder zu haben Prozesse verhalten asynchron.

War es hilfreich?

Lösung

Sie können nicht überprüfen, ob ein Prozess ein Zombie mit reinen POSIX ist nennt - es sei denn, Sie die Eltern-Prozess sind, und mit einem Anruf wait Familie. So haben Sie einen guten Platz zu warten, bis das Kind finden müssen.

Eine Option ist ein SIGCHLD Handler zu setzen und eine waitpid(0, &status, WNOHANG) es zu tun. Achten Sie darauf, Schleife, bis es nicht mehr alle Prozesse findet -. Wenn zwei Kinder innerhalb eines kurzen Zeitraums sterben, nur ein SIGCHLD erhalten kann

Eine andere Möglichkeit ist es, Doppelgabel - das heißt, fork(), das Kind haben (nennen wir es Kind A) Gabel wieder, haben das zweite Kind (Kind B) exec. Dann Kind A sofort beendet. Inzwischen ist die Eltern für Kind A. wait()ing Sobald ein Kind verschwunden ist, das Init-Prozess des Systems kümmert Kind B zu ernten, wenn es schließlich stirbt. Diese Methode ist einfacher, aber die Shell hat keine Möglichkeit zu wissen, wenn Kind B stirbt, so, wenn Sie diese Informationen benötigen, die frühere Methode verwenden.

Andere Tipps

Aber .. aber .. der Zombie ist ein Kind (auf einer bestimmten Ebene) und der Prozess, der ein Elternteil ist die Überprüfung, nicht wahr? Also, wenn Sie befürchten, dass eine bestimmte pid ein Zombie ist, warum nicht nur ein waitpid(2) mit WNOHANG tun und es loszuwerden? Nun wird diese den Exit-Status verbrauchen, so kann es eine schlechte Idee sein, wenn ein anderer Prozess wirklich will, könnte in Zukunft wait.

Sie erwähnen, dass Sie eine Unix-Shell bauen; Der richtige Umgang mit SIGINT / SIGQUIT

: Sie sollten diese lesen

Normalerweise wird die Shell prüft für verstorbene Kinder kurz vor der Prompts - den waitpid(2) Systemaufruf und die WNOHANG Option wie bereits diskutiert. Vielleicht wollen Sie auch einen SIGCHLD Handler - aber man müßte entscheiden, was Sie mit den Informationen tun werden, wenn Sie für einige Vordergrundprozesse beschäftigt warten sind zu beenden, und es ist tatsächlich ein Hintergrundprozess, beendet

Dies ist nur eine geringfügige Veränderung auf die aktuell ausgewählte Antwort.

Und was ist mit dem Shell-Befehl ‚ps‘, die Sie in der Tabelle der aktiven Prozesse zeigt, wo Sie finden können, dass ein Prozess ‚nicht mehr existierenden‘ ist? Ich nehme an, es muss ein Weg geben, dass die Informationen von C-Code zu erhalten.

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