Zum Inhalt springen

Fork (Unix)

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 20. Juli 2007 um 08:04 Uhr durch Semper (Diskussion | Beiträge) (rev. war schon richtig). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Beim Systemaufruf Fork erzeugt der aktuelle Prozess eine Kopie von sich selbst, welche dann als sogenannter Kindprozess des erzeugenden Programmes dient. Der Kindprozess übernimmt die Daten, den Maschinencode und den Befehlszähler. Dabei erhält der Kindprozess eine eigene PID.

Ein Kindprozess arbeitet normalerweise nicht exakt wie der Elternprozess weiter, sondern enthält abweichende Anweisungen oder/und neue Einstellungen.

An dem Rückgabewert von fork() wird erkannt, in welchem Prozess man sich befindet. Liefert fork() eine 0 zurück, kennzeichnet dies den Kindprozess, im Vaterprozess wird die PID des Kindes zurückgeliefert. Bei einem Fehler liefert fork einen Wert kleiner 0 und kein Kindprozess wurde erzeugt.

Beispiel

Das folgende Programm ist in der Programmiersprache C geschrieben und soll zeigen, wie ein Fork funktioniert. Das Beispielprogramm zählt von 0 bis 9 und gibt den Wert des jeweiligen Prozesses aus.

   int pid, j, i;

   pid = fork();

   if (pid == 0)
   {
      /* Kindprozess
       * wenn fork eine 0 zurückgibt, befinden wir uns im Kindprozess
       */
      for (j=0; j < 10; j++)
      {
         printf ("Kindprozess: %d\n", j);
         sleep (1);
      }
      exit (0);
   }
   else if (pid > 0)
   { 
      /* Vaterprozess
       * Gibt fork einen Wert größer 0 zurück, so ist dies die PID des Kindprozesses
       */
      for (i=0; i < 10; i++)
      {
         printf ("Vaterprozess: %d\n", i);
         sleep (1);
      }
   }
   else
   {   
      /* Wird ein negativer Wert zurückgegeben, ist ein Fehler aufgetreten */
      fprintf (stderr, "Error");
      exit (1);
   }

Mögliche Ausgabe des Programms

 Vaterprozess: 0
 Kindprozess: 0
 Kindprozess: 1
 Vaterprozess: 1
 Vaterprozess: 2
 Kindprozess: 2
 Kindprozess: 3
 Vaterprozess: 3
 Vaterprozess: 4
 Kindprozess: 4
 Kindprozess: 5
 Vaterprozess: 5
 Vaterprozess: 6
 Kindprozess: 6
 Kindprozess: 7
 Vaterprozess: 7
 Vaterprozess: 8
 Kindprozess: 8
 Kindprozess: 9
 Vaterprozess: 9

Die Reihenfolge der Ausgaben kann variieren