Ich frage mich, ob der folgende Code Zombies erstellen:Kann dieser C-Code Zombie-Prozesse erzeugen?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(){
int i=1;
pid_t p;
p = fork();
i++;
if(p!=0){
waitpid(p, NULL, 0);
}
printf("%d\n",i);
return 0;
}
So ruft der Eltern-Prozess den waitpid für das Kind Prozess, der sofort zurück, wenn das Kind nicht bereits verlassen hat. Also, bis jetzt können keine Zombies entstehen. Aber wenn das Kind vor
return 0;das Kommando verlässt, wäre das dann ein Zombie? Ich bin wirklich verwirrt darüber. Sollte die waitpid die letzte Codezeile sein, bevor das Programm beendet wird? Jede Hilfe wäre willkommen. Vielen Dank!
Das sieht gut aus, aber Sie haben vielleicht ein Missverständnis. Das 'waitpid' kehrt sofort zurück, wenn das Kind bereits gestorben ist; Andernfalls blockiert es, bis das Kind stirbt. Es sei denn, Sie verwenden WNOHANG mit dem waitpid, in diesem Fall wird es nicht blockieren, aber das ist hier nicht in Frage. – Duck
Korrigieren Sie mich, wenn ich falsch liege, aber ich denke, dass der dritte Parameter (Null) WHOHANG entspricht. Wie auch immer, nehmen wir an, es war WHOHANG. Würde dann ein Zombie erstellt werden und wie? Und schließlich, sollte der waitpid der letzte Befehl sein, bevor 0 zurückgegeben wird; um sicherzustellen, dass keine Zombies erstellt werden ?. Danke noch einmal! – mgus
Nein WNOHANG ist definitiv nicht gleich Null. Zero ist der Standardwert und es würde keinen Sinn ergeben, bitweise - oder WNOHANG, wenn es gleich 0 war. Wenn das Kind nach einem nicht blockierenden 'waitpid' starb und das Elternteil zuerst austrat, dann Sie Ich hätte einen Zombie. Normalerweise würden Sie jedoch eine nicht blockierende 'waitpid' in einer Schleife und möglicherweise in Verbindung mit dem Empfang von SIGCHLD verwenden. Waitpid selbst kann überall im Code sein, solange es Ihre Kinder behandelt, wenn es dazu aufgefordert wird. – Duck