fork(), wait() und zobies?

Dieses Thema im Forum "C/C++" wurde erstellt von marcellus, 04.08.2007.

  1. #1 marcellus, 04.08.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    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?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Mortl, 04.08.2007
    Zuletzt bearbeitet: 04.08.2007
    Mortl

    Mortl Grünschnabel

    Dabei seit:
    09.06.2007
    Beiträge:
    6
    Zustimmungen:
    0
    Ort:
    Bayerischer Wald
    Ok, ich zitiere mich nochmal selbst:

    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
     
  4. #3 marcellus, 04.08.2007
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    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?
     
  5. #4 Mortl, 04.08.2007
    Zuletzt bearbeitet: 04.08.2007
    Mortl

    Mortl Grünschnabel

    Dabei seit:
    09.06.2007
    Beiträge:
    6
    Zustimmungen:
    0
    Ort:
    Bayerischer Wald
    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!
     
  6. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

fork(), wait() und zobies?

Die Seite wird geladen...

fork(), wait() und zobies? - Ähnliche Themen

  1. Probleme mit fork() und mehreren Teilfenstern

    Probleme mit fork() und mehreren Teilfenstern: Hi, Ich programmiere gerade eine Shell anwendung für Unix in C. Folgendes Problem: Ich habe mit der Curses Bibliothek mittels subwin() das...
  2. Systemfunktion fork()

    Systemfunktion fork(): Hallo! Mal ne Frage. So blöd diese für micht klingt. Gibt es Möglichkeiten fork() irgendwie zu optimieren? Vielen Dank Renn
  3. Prozesse mit fork()

    Prozesse mit fork(): Hallo ! Ich habe hier bei meinem Programm irgendwie ein Verständnisproblem mit diesen ganzen Parent/Child Prozessen. Hier mal das Programm...