Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Fork vs PID

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
AlPhedo



Anmeldungsdatum: 23.06.2006
Beiträge: 5

BeitragVerfasst am: 24. Jun 2006 12:55   Titel: Fork vs PID

Hi,

ich hab mir ein kleines Programm geschrieben, mit dem über fork() Prozesse erzeugt werden und über getpid() die Prozessnummer ausgegeben wird.
Alledings hab ich mir ein paar Tips holen müssen und verstehe es irgendwie noch nicht so.
Hier ist der Quellcode:
Code:
#include <stdio.h>

int main()
{
int kind = 3;
int enkel =2;
int i,j,pid,kind_pid;

for (i=0;i<kind;i++)
{
   pid = fork();
   if (pid == 0)
   {
      kind_pid = getpid();
      printf("\n PID von Kind: %d\n",kind_pid);
   
      for (j=0;j<enkel;j++)
      {   
         pid= fork();
         if (pid == 0)
         {
         printf("\n PID von Enkel %d des Kindes %d\n",getpid(),kind_pid);
         break;  // <<<<---*****_____---------------  HIER nr1
         }
      }   
      break; // <<<<---*****_____---------------  HIER nr2
   }
}   
}


Wieso genau muss das break; jeweils in die if-Bedingung?? die Schleife regelt doch die Anzahl?? Aber wenn ich das break weg lasse - ist die Ausgabe total wirr!!!

Meine andere Frage : wenn ich das Prg über die Bash kompiliere und ausführe: ist die Ausgabe zwar korrekt ABER die Eingabezeile taucht mitten in der Ausgabe des Programms auf -- wieso das passiert, kann ich echt nicht nachvollziehen?!?!?!

mfG
AlPhedp
 
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 24. Jun 2006 14:29   Titel: Re: Fork vs PID

AlPhedo hat folgendes geschrieben::

Wieso genau muss das break; jeweils in die if-Bedingung?? die Schleife regelt doch die Anzahl?? Aber wenn ich das break weg lasse - ist die Ausgabe total wirr!!!

Um das Prinzip besser zu verstehen lässt du besser erstmal alles weg, was mit den Enkeln zu tun hat. Es bleibt:
Code:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
 
int main()
{
  int kind = 3;
  int i,pid,kind_pid;
 
  for (i=0;i<kind;i++)
  {
    pid = fork();
    if (pid == 0)
    {
      kind_pid = getpid();
      printf("\n PID von Kind: %d\n",kind_pid);
   
      break; // <<<<---*****_____---------------  HIER nr2
    }
  }   
}

Das break wird gebraucht, weil ja nach dem fork() *zwei* Prozesse dasselbe Programm ausführen. Es gibt jeweils den Kind-Teil, der in den then-Teil des if-Blocks reinläuft, und halt den Vater-Teil, der daran vorbeiläuft. Der Kind-Teil soll ja nicht erneut fork() aufrufen, also braucht er das break, um aus der Schleife auszubrechen und sich dann zu Beenden.

Zitat:

Meine andere Frage : wenn ich das Prg über die Bash kompiliere und ausführe: ist die Ausgabe zwar korrekt ABER die Eingabezeile taucht mitten in der Ausgabe des Programms auf -- wieso das passiert, kann ich echt nicht nachvollziehen?!?!?!

Weil die Kindprozesse weiterlaufen, auch wenn der Vaterprozess beendet wurde. Die Bash kommt also zurück, aber die Kindprozesse laufen noch, erzeugen also noch Ausgaben in dasselbe tty.

Janka
_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
 
Benutzer-Profile anzeigen Private Nachricht senden

AlPhedo



Anmeldungsdatum: 23.06.2006
Beiträge: 5

BeitragVerfasst am: 25. Jun 2006 12:04   Titel:

sehr sehr seltsam die fork() .... aber ich glaube ich habe es jetzt soweit.

kann man es eigentlich verhindern, dass das Eingabeprompt in der Ausgabe erscheint?

viele Grüße
AlPhedo
 
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 25. Jun 2006 15:42   Titel:

Nein, fork() ist nicht seltsam. fork() ist halt fork(). Du willst, dass *ein* Programm ab einem bestimmten Punkt *zweimal gleichzeitig* ausgeführt wird. Das ist fork. Und damit die beiden Teile unterschiedliche Wege nehmen können (sonst wäre das ganze ja ziemlich sinnlos) bekommen Vater und Kindprozess halt *unterschiedliche* Werte aus dem fork() raus.

Der Rest ist gleich -- logisch, denn beide Prozesse teilen sich ja die ganze Zeit über dieselbe Codebasis.

Wenn du *danach* z.B. dem Kind eine neue Codebasis geben willst (neues Programm starten), muss du *danach* execve() etc. benutzen.

"Neues Programm" ist unter Unix immer die Paarung fork() + execve().

Zitat:

kann man es eigentlich verhindern, dass das Eingabeprompt in der Ausgabe erscheint?

Man kann (sollte) im Vater-Zweig einen wait() oder waitpid()-Aufruf machen. Dann wird der Vater angehalten, bis ein Kind beendet wird.

Janka
_________________
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
 
Benutzer-Profile anzeigen Private Nachricht senden

AlPhedo



Anmeldungsdatum: 23.06.2006
Beiträge: 5

BeitragVerfasst am: 25. Jun 2006 17:58   Titel:

alles klar vielen Dank!!!!!!!!!!!!!!!

viele Grüße AlPhedo
 
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy