1 Vater und 2 Sohnprozesse erzeugen ?

will2k

Mitglied
Hallo,

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

dieser Code:

C++:
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/8c9d91d6649dc0e3ad0859bc1.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?
 
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
 
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?
 
Doch, denn der Sohn führt ja den Code NACH der Else-Anweisung auch aus.

Also nach Zeile 13 lebt der Sohn ja weiter.
 
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 :confused:

Vater erzeugt 2 Söhne wie geht das?
 
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
 
ok

hab ma deinen Code umgeschrieben

Code:
	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
 
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:
 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:
#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());
       	}
    } 
 
}
 
Zuletzt bearbeitet:
Zurück