Zombie ist nicht wirklich mit den anderen verwandt; Es ist einfach ein Prozess, der beendet wurde, aber sein übergeordneter Prozess hat seinen Exit-Status noch nicht mit waitpid()
oder ähnlich gelesen . Sie sollten diese nicht sehen, es sei denn, ein Prozess ist fehlerhaft oder gestoppt.
Ein Daemon ist ein Programm, das ohne steuerndes Terminal ausgeführt wird. Wenn Sie das Programm ausführen, wird es fork()s
normalerweise selbst ausgeführt und das übergeordnete Programm wird beendet, sodass die Shell den Befehl für beendet hält und der untergeordnete Prozess vom Terminal getrennt wird und die Anmeldesitzung verlässt. Da der übergeordnete Prozess beendet wurde, wird die übergeordnete Prozess-ID zu 1, was traditionell das init
Programm ist, oder heutzutage systemd
. Dieser Prozess stellt sicher, dass die Kinder geerntet werden, wenn sie sterben, damit Sie nicht von Zombies überrannt werden.
Ein Prozess kann einem steuernden Terminal zugeordnet werden , von dem er normalerweise seine Eingabe erhält und dessen Ausgabe an sendet. Das Terminal kann auch Signale an damit verbundene Prozesse senden und eine Prozessgruppe als Vordergrundgruppe identifizieren . Prozesse, die sich in der Vordergrundgruppe befinden, können Eingaben vom Terminal lesen und erhalten SIGINT- und SIGSUSP-Signale, wenn Sie Strg-C und Strg-Z drücken. Jeder Prozess, der sich nicht in der Vordergrundgruppe befindet und versucht, vom Terminal zu lesen, wird mit SIGTSTP angehalten.
Die Shell erstellt für jeden Pipeline-Befehl, den Sie ausführen sollen, unterschiedliche Prozessgruppen und verschiebt die Vordergrundgruppe , um Jobs zwischen Vordergrund und Hintergrund zu verschieben. Wenn Sie einen Befehl ausführen, erstellt die Shell normalerweise eine neue Prozessgruppe und diese Gruppe zur Vordergrundgruppe . Wenn Sie es mit einem Suffix versehen, &
verlässt die Shell einfach die Vordergrundgruppe, in der sie sich befand, und die neue Gruppe befindet sich im Hintergrund. Durch Drücken von Strg-Z wird SIGSUSP an die Vordergrundgruppe gesendet, wodurch die meisten Befehle angehalten werden. Anstatt anzuhalten, ändert die Shell die aktive Vordergrundgruppe wieder in sich selbst, sodass Sie zur Eingabe eines neuen Befehls aufgefordert werden können.
Der bg
Befehl sendet SIGCONT an eine Prozessgruppe, damit die Ausführung im Hintergrund fortgesetzt werden kann, nachdem sie mit SIGSUSP angehalten wurde. fg
Ändert die Vordergrundgruppe in eine der vorhandenen Gruppen, die bereits im Hintergrund ausgeführt werden, und bringt sie in den Vordergrund.
fork()
, eine Kopie von sich selbst zu entfernen undexec()
in dieser Kopie zu verwenden um es durch das zu ersetzen, was Sie ausführen möchten, und um eswait()
in der ursprünglichen Programminstanz zu verwenden (nicht in der Kopie, die ausgeführt wurdeexec()
). In der sehr, sehr kurzen Zeitspanne zwischen demwait()
Beenden des Kindes und dem Ernten dieses Beendigungsstatus (Entfernen aus der Prozesstabelle und Zurückgeben an den Anrufer) haben Sie einen Zombie.