fork(), wait() und zobies?

marcellus

marcellus

Kaiser
Ich hab bei einem älteren thread angefangen um eine vielzahl an redundanten threads zu vermeiden. Der thread dazu http://www.unixboard.de/vb3/showthread.php?p=252739#post252739

Und hier meine frage

Ich les gerade linux-unix-programmierung und versteh nicht ganz was diese Zeile macht.

Code:

pid = fork ();

Es geht hier im speziellen um dieses Programm: http://www.pronix.de/pronix-170.html
(daemon.c)

Es wird ein Prozess gestartet, schon klar, nur was und warum und was macht der und wieso steht oben irgendwas von wegen signalhandler und was hat das ganze mit zombies und wait() zu tun?
 
Ok, ich zitiere mich nochmal selbst:

fork "klont" ganz einfach den aktuellen Prozess. Der neue Prozess ist dann ein Kind von diesem, hat aber seine eigene PID.

Am Rückgabewert von fork läst sich erkennen in welchem Prozess man sich befindet. Gibt fork 0 zurück befindet man sich im Kindprozess, im "Vaterprozess" wird die PID des Kindprozesses zurückgegeben.

IMHO entsteht ein Zombie wenn der Kindprozess mit seiner Arbeit fertig ist, aber der Exit-Status nicht vom Vaterprozess verarbeitet wird(glaub mit wait() bzw. waitpid()).

Noch 2 Beispiele:

Normaler Ablauf:

Code:
#include <stdio.h>
#include <unistd.h>
#include  <sys/types.h>

int main()
{
        pid_t pid = fork();

        if(pid == 0)
        {
                //Wir befinden uns im Kindprozess

                printf ("Hallo Vater\n");

                return 0;
        }
        else
        {
                //Wir befinden uns im Vaterprozess

                int status;

                wait(&status);              

                printf ("Hallo Kind\n");
        }

        return 0;
}

Und hier ein Beispiel bei dem ein Zombie übrig bleibt:

Code:
#include <stdio.h>
#include <unistd.h>
#include  <sys/types.h>

int main()
{
        pid_t pid = fork();

        if(pid == 0)
        {
                //Wir befinden uns im Kindprozess

                printf ("Hallo Vater\n");

                return 0;
        }
        else
        {
                //Wir befinden uns im Vaterprozess                              

                printf ("Hallo Kind\n");

                while(1) sleep(1); //Damit sich der Vaterprozess nicht beendet
        }

        return 0;
}

Im letzten Beispiel wird der "return-Wert" des Kindprozesses nicht mit wait verarbeitet und daher bleibt der Kindprozess als Zombie bestehen bis dies geschieht.

Das kann mach mit "ps" nachprüfen, der Prozess wird mit "defunct" gekennzeichnet.

mfg
Mortl
 
Zuletzt bearbeitet:
Ja schon klar, aber wie wird man die zombies wieder los? Und was für einen sinn machts auf den kinderprozess zu warten, wenn sich der eh nicht beendet?

Mal abgesehen davon wieso tritt bei deinem beispiel ein zombie auf, wenn der vaterprozess weiterläuft und der kind sich ansich eh beendet. Oder liegt das nur daran, dass du die rückgabe von dem prozess nie abfragst?
 
Mal abgesehen davon wieso tritt bei deinem beispiel ein zombie auf, wenn der vaterprozess weiterläuft und der kind sich ansich eh beendet. Oder liegt das nur daran, dass du die rückgabe von dem prozess nie abfragst?

Genau das ist der Punkt warum ein Zombie übrig bleibt!

Wenn der Vaterprozess beendet wäre würde auch das Zombiekind verschwinden, deswegen hab ich ne kleine Endloschleife eingebaut.

Mir ist gerade aufgefallen das ich in meiner Eile "wait" und "waitpid" durcheinander gebracht habe. Werd ich gleich noch korrigieren...

"wait" wartet nur bis sich ein Kindprozess beendet und gibt die PID und einen Status-Wert zurück!
 
Zuletzt bearbeitet:

Ähnliche Themen

Squid als RPCoHTTPS Proxy für Outlook Anywhere

Problem mit Apache2 + MySQL Server

Ubuntu 9.04 und USB-Inet-Stick Huawei E620

Japanisch unter Linux

Debian Sid und ein paar Probleme.

Zurück
Oben