tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
2070
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    will2k will2k ist offline Mitglied Silber
    Registriert seit
    Jan 2008
    Beiträge
    58
    Hallo,

    ich möchte 1 Vaterprozess erzeugen, der wiederum 2 Sohnprozesse startet:

    dieser Code:

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    pid = fork();
         if (pid < 0)
       {
          printf("Fehlermeldung: %s bei fork. \n" , strerror(errno));          
       }
       else if (pid == 0)
       {     
          printf("Sohn1: %d \n" , getpid());                
       } 
       else
       {
          printf("Vater: %d: arbeitet weiter... und wartet nicht auf Sohn1: %d\n\n", getpid() , pid);       
       }
       
       pid = fork();
         if (pid < 0)
       {
          printf("Fehlermeldung: %s bei fork. \n" , strerror(errno));          
       }
       else if (pid == 0)
       {     
          printf("Sohn1: %d \n" , getpid());                
       } 
       else
       {
          printf("Vater: %d: arbeitet weiter... und wartet nicht auf Sohn2: %d\n\n", getpid() , pid);       
       }

    gibt diese Ausgabe:

    http://image-upload.biz/files/8c9d91...3ad0859bc1.png


    Ich dachte ich erzeuge hier 2 Sohnprozesse doch sehe ich jede Menge Söhne und Väter... ?

    Auch würde ich die Prozesse unter Ubuntu gerne kontrollieren können sprich wer wann startet und beendet wurde etc. Unter der Systemüberwachung sehe ich zwar Prozesse, doch nicht die Prozesse , die von mir erzeugt wurden?
     

  2. #2
    higret higret ist offline Mitglied Silber
    Registriert seit
    Jun 2003
    Beiträge
    74
    Hi

    wenn du den Sohn1 erzeugt hast, dann hast du zwar ne If-Anweisung um zuerkennen, ob das Sohn oder der Vater ausführt, aber der Sohn führt ja auch die 2. fork Anweisung aus.

    lg
     

  3. #3
    will2k will2k ist offline Mitglied Silber
    Registriert seit
    Jan 2008
    Beiträge
    58
    Zitat Zitat von higret Beitrag anzeigen
    Hi

    wenn du den Sohn1 erzeugt hast, dann hast du zwar ne If-Anweisung um zuerkennen, ob das Sohn oder der Vater ausführt, aber der Sohn führt ja auch die 2. fork Anweisung aus.

    lg
    aber die 2.fork anweisung befindet sich doch gar nicht im bereich von sohn1... wie kann der dann die 2. fork anweisung ausführen?
     

  4. #4
    higret higret ist offline Mitglied Silber
    Registriert seit
    Jun 2003
    Beiträge
    74
    Doch, denn der Sohn führt ja den Code NACH der Else-Anweisung auch aus.

    Also nach Zeile 13 lebt der Sohn ja weiter.
     

  5. #5
    will2k will2k ist offline Mitglied Silber
    Registriert seit
    Jan 2008
    Beiträge
    58
    Zitat Zitat von higret Beitrag anzeigen
    Doch, denn der Sohn führt ja den Code NACH der Else-Anweisung auch aus.

    Also nach Zeile 13 lebt der Sohn ja weiter.
    ok dann ist der code nach Zeile 13 falsch..., denn der sohn1 soll ja nicht nochmals einen Prozess erzeugen, sondern der Vater... wobei der Vater prozess (so kann mans auch sehen) ja das eigentliche Programm ist

    Vater erzeugt 2 Söhne wie geht das?
     

  6. #6
    higret higret ist offline Mitglied Silber
    Registriert seit
    Jun 2003
    Beiträge
    74
    is doch einfach, du musst einfach die 2. fork anweisung incl. dem IF-Block in dem if-Zweig beim ersten fork für der Vater verschieben (also nach Zeile 12)

    lg
     

  7. #7
    will2k will2k ist offline Mitglied Silber
    Registriert seit
    Jan 2008
    Beiträge
    58
    Zitat Zitat von higret Beitrag anzeigen
    is doch einfach, du musst einfach die 2. fork anweisung incl. dem IF-Block in dem if-Zweig beim ersten fork für der Vater verschieben (also nach Zeile 12)

    lg
    sorry aber das verstehe ich von der Rechtschreibung her nicht, kein Witz
     

  8. #8
    higret higret ist offline Mitglied Silber
    Registriert seit
    Jun 2003
    Beiträge
    74
    ok

    hab ma deinen Code umgeschrieben

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
        pid = fork();
        if (pid < 0)
        {
            printf("Fehlermeldung: %s bei fork. \n" , strerror(errno));
        }
        else if (pid == 0)
        {
            printf("Sohn1: %d \n" , getpid());
        }
        else
        {
            printf("Vater: %d: arbeitet weiter... und wartet nicht auf Sohn1: %d\n\n", getpid() , pid);
            
            // Vater erstellt 2. Sohn
            pid = fork();
            if (pid < 0)
            {
                printf("Fehlermeldung: %s bei fork. \n" , strerror(errno));
            }
            else if (pid == 0)
            {
                printf("Sohn2: %d \n" , getpid());
            }
            else
            {
                printf("Vater: %d: arbeitet weiter... und wartet nicht auf Sohn2: %d\n\n", getpid() , pid);
            }
        }
        
        // ab hier wird der Code von den beiden Söhnen + Vater ausgeführt

    lg

    PS: meine Grammatik war auch schon mal besser
     

  9. #9
    will2k will2k ist offline Mitglied Silber
    Registriert seit
    Jan 2008
    Beiträge
    58
    was ich letztendlich habe möchte sind 10 parallele Prozesse und ich habe keinen blassen Schimmer wie ich das realisieren kann, daher andere Frage, wenn der Vaterprozess mit wait() auf den exit-status des Sohnprozesses wartet, der Sohn in seinem if-zweig aber kein exit(0) hat stirbt der Sohn ja nicht sprich er bleibt als voller Sohnprozess im Speicher oder ?

    Ergebnis: Nein, der Sohn fliegt aus dem Speicher raus als Prozess, doch warum? Antwort: weil der if-Zweig verlassen wird ? ist das so?

    warum lese ich im Internet immer wieder exit(0) , exist(10) usw... was immer das gleiche machen soll? Hat mir jemand bitte eine vollständige Parameterliste für die Funktion exit() ?

    Code :
    1
    
     sprintf(kdo,"ps -ef |grep %s |grep defunct |grep -v gep | wc -1" , argv[0]);
    der parameter -1 geht nicht dann mache ich -l (ein "L") doch ich bekomme nicht die anzahl der Zombies mit obiger sprintf-Ausgabe? Weiß jemand woran das liegt?

    Warum wird das printf des VAterprozesses nie ausgegeben, wenn doch der Vaterprozess parallel zum Sohnprozess läuft, dürfte der Vater die endlosschleife des Sohnes doch gar nicht beachten?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    #include <sys/types.h>
    #include <errno.h>
     
    main(int argc , int **argv)
    {
        pid_t pid;
        char kdo[50];
        int status;
        sprintf(kdo,"ps -ef |grep %s |grep defunct |grep -v gep | wc" , argv[0]);
      
        pid = fork();
        
        /*------------------------------------------------ Fehler bei Prozess erzeugen ------------------------------- */
        if(pid < 0)
        {
                printf("Fehlermeldung %s bei fork. \n", strerror(errno));
                exit(-1);
        }
        /*------------------------------------------------- Sohn Prozess ---------------------------------------------- */
        if (pid == 0) 
        {
           while(1)
           {
                 printf("Sohn (%d) kann jetzt ewig arbeiten, da er in einer Schleife läuft! mit 3 sekunden Pause. \n" , getpid());
                 sleep(3);
           }       
                
        }
        /*-------------------------------------------------- Vater Prozess --------------------------------------------- */
        if(pid > 0)
        {
            pid = wait(&status);
            
            printf("Vater (%d) warte auf Sohn (%d) \n", getpid() , pid);
            while(1)
            {
                 printf("Vater (%d): Anzahl an Zombies(toten Kindern): \n", getpid());
                 system(kdo);   
                 sleep(5); // 5 sekunden warten
                 printf("Vater (%d) arbeitet... (Abbruch mit STRG+C) \n" , getpid());
            }
        } 
     
    }
    Geändert von will2k (28.04.08 um 13:17 Uhr)
     

Ähnliche Themen

  1. Welches Modem für meinen Vater?
    Von Alexander Groß im Forum Internet, DSL & Flatrate
    Antworten: 6
    Letzter Beitrag: 13.05.10, 23:31
  2. Wenn einem Vater die Kamera abnimmt..
    Von FrankyFlowers im Forum Fotografie
    Antworten: 2
    Letzter Beitrag: 07.07.07, 01:34
  3. Ausgabe von Bäumen mit Vater-Zeiger
    Von qsrs im Forum PHP
    Antworten: 8
    Letzter Beitrag: 15.12.06, 15:18
  4. ISDN Einwahl über Fitzcard zu Computer von meinem Vater
    Von 16V-Schrauber im Forum Netzwerke
    Antworten: 7
    Letzter Beitrag: 22.09.06, 11:29
  5. Wer ist Anakin Skywalkers Vater?
    Von revenge86 im Forum Smalltalk
    Antworten: 7
    Letzter Beitrag: 18.11.05, 09:52