Hier ist ein einfaches Rezept, das einen Zombie schaffen sollte:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int main()
{
int pid = fork();
if(pid == 0) {
/* child */
while(1) pause();
} else {
/* parent */
sleep(1);
kill(pid, SIGKILL);
printf("pid %d should be a zombie\n", pid);
while(1) pause();
}
}
Der Schlüssel ist, dass die Eltern - das heißt dieses Programm - läuft weiter, aber tut nicht eine wait()
tun auf das sterbende Kind.
Zombies sind tote Kinder, auf die nicht gewartet wurde. Wenn dieses Programm auf sein totes Kind wartete, würde es verschwinden und kein Zombie sein. Wenn dieses Programm beendet wird, würde das Zombie-Kind von jemand anderem vererbt werden (wahrscheinlich init
), was wahrscheinlich das Warten würde, und das Kind würde weggehen und kein Zombie sein.
Soweit ich weiß, ist der ganze Grund für Zombies, dass das tote Kind mit einem Exit-Status beendet wurde, den jemand vielleicht haben möchte. Aber wo Unix speichert, ist der Exit-Status in der leeren Hülle des toten Prozesses und wie Sie den Exit-Status eines toten Kindes abrufen, indem Sie darauf warten. Also hält Unix den Zombie herum, nur um seinen Exit-Status zu behalten, nur für den Fall, dass die Eltern ihn haben wollen, aber noch nicht dazu gekommen ist, wait
anzurufen.
So ist es eigentlich poetisch: Unix Philosophie hier ist im Grunde, dass kein Kind Tod unbemerkt bleiben sollte.
Das ist also in Ordnung, ein Kindprozess hat seine eigene PID und begeht Selbstmord. – ForceBru
Sie können den Zombie nicht sehen, wenn der Elternprozess beendet wird (es sei denn, Sie haben Glück mit dem Timing). Weil der Child-Prozess von 'init' geerntet wird. Von der ['wait'-Manpage] (http://linux.die.net/man/2/wait):" Wenn ein Elternprozess endet, werden seine "Zombie" -Kinder (falls vorhanden) von init (8), die automatisch eine Wartezeit zum Entfernen der Zombies ausführt. " – kaylum