2016-04-27 2 views
1

Frage: Wie kann ich bestimmen, welche einen "ZombieProzess" produziertConfused auf "Zombie-Prozessen" in C-Programmierung

// Case 1 

while(fork()) 

    ; 

exit(0); 


// Case 2 

while(!fork()) 

    ; 

exit(0); 

Ich weiß, dass ein " Zombie "ist - wenn ein Prozess endet und immer noch Ressourcen verbraucht. (Oder zumindest Ich denke das ist, was es ist)

Ich denke, dass Fall 1 ist der Fall, in dem produzieren ein Zombie-Prozess, weil es zurück -1 auf einen Fehler, und während (- 1) = wahr, so wird es einfach weitergabeln? Ich bin mir nicht wirklich sicher. Jeder Einblick wäre toll,

BTW: Dieser Code wird ausgeführt auf einer Linux Umgebung in dem c Programmiersprache

Vielen Dank im Voraus

+0

Weder ** ist ** ein Zombie-Prozess. Einer von ihnen kann ** Zombie-Prozesse ** erstellen. – immibis

+0

Ist es der erste Fall? –

+1

Ein Zombie-Prozess ist einer, dessen Elternprozess noch nicht abgeschlossen ist, aber noch nicht über die Beendigung informiert wurde. Auf Systemen vom Typ * nix erfordert diese Benachrichtigung, dass dem übergeordneten Element nicht nur gesagt wird, dass eines der untergeordneten Elemente nicht vorhanden ist, sondern explizit eine Funktion (wie 'wait()' und andere) aufrufen muss, die die Benachrichtigung blockiert. Sie haben immer dann einen Zombie, wenn Sie ein Kind erstellt haben, und dieses Kind wird beendet, und Sie beenden weder noch rufen Sie eine der Wartefunktionen auf. – mah

Antwort

3

Ein Zombie-Prozess ist ein Kind Prozess, der beendet , aber wurde nicht von den Eltern gewartet. Child-Prozesse werden in der Regel durch Gabel erstellt:

int pid = fork(); 
if (pid < 0) { 
    // fork failed 
} else if (pid == 0) { 
    // this is the child process 
} 
// this is the parent 

fork 0 zurück, um das Kind Prozess und eine positive pid an die Eltern. Es gibt zwei Fälle hinsichtlich ihrer Kündigung:

  1. Kind Ausfahrt vor Eltern, dann wird das Kind einen „Zombie“ Prozess, bis die Eltern die Warte Familie Funktionen aufrufen, um das Exit-Status des Kindes zu bekommen.

  2. Eltern-Exit vor Kind, dann wird das Kind erneut in den Init-Prozess umgewandelt, der Init-Prozess wird warten, wenn das Kind beendet wird. Dies funktioniert, weil der Elternteil das SIGCHLD-Signal empfängt, wenn sein Kind austritt, und er kann im Signalhandler warten aufrufen. In diesem Fall wird kein Zombie erstellt.

Beachten Sie auch, die Posix definiert keine Zombies erstellt, wenn die SIGCHLD von den Eltern ignoriert wird:

POSIX.1-2001 gibt an, dass, wenn die Anordnung von SIGCHLD eingestellt ist SIG_IGN oder die SA_NOCLDWAIT Flag ist für SIGCHLD gesetzt (siehe sigaction (2)), dann Kinder, die nicht enden werden Zombies und ein Aufruf von wait() oder waitpid() wird blockieren, bis alle Kinder beendet haben, und dann fehlgeschlagen mit errno auf ECHILD gesetzt . (Der ursprüngliche POSIX-Standard hat das Verhalten des Festlegens von SIGCHLD auf SIG_IGN nicht angegeben. Beachten Sie, dass obwohl die Standarddisposition von SIGCHLD "ignorieren" ist, das Festlegen der Disposition für SIG_IGN-Ergebnisse in unterschiedlicher Behandlung von Zombie-Prozess-Kindern.)

Für die beiden Fälle im OP:

// Case 1 
while(fork()) // same as while(fork() != 0) 
    ; 

exit(0); 


// Case 2 
while(!fork()) // same as while(fork() == 0) 
    ; 

exit(0); 

Der erste Code hält in der Mutter gabelt, egal gelingt es oder nicht, und die resultierenden Kinder sofort, da den Rückgabewert beenden wird sei 0. Da der Elternteil in der while-Schleife hängt, egal, ob die Gabel erfolgreich ist oder nicht (fork gibt nur 0 für Kinder zurück), werden alle Kinder zu Zombies. Für den zweiten Fall wird der Elternteil sofort beendet, wenn die Gabel zurückkehrt, aber das Kind behält die Gabelung bei, und dieses Kind wird wieder dasselbe tun, dh es wird sofort beendet, und das Kind, das es erstellt hat, behält seine Gabelung bei. In diesem Fall werden seit dem Eltern-Exit alle seine Kinder erneut in den init-Prozess repariert, wodurch keine Zombies erstellt werden.

+0

OP wurde bearbeitet. Welcher Fall würde * einen Zombieprozess * hervorbringen? –

+1

@Shammy Antwort wird aktualisiert, um auf die 2 Fälle in OP zu konzentrieren. – fluter