Montag, 28. Mai 2012

Themen


Fork (Unix)

Beim Systemaufruf Fork erzeugt der aktuelle Prozess eine Kopie von sich selbst, welche dann als Kindprozess des erzeugenden Programmes läuft. Der Kindprozess übernimmt die Daten, den Maschinencode und den Befehlszähler vom Elternprozess und erhält vom Betriebssystem (wie der Elternprozess und jeder andere Prozess auch) eine eigene Prozessnummer, die PID (engl. „Process IDentifier“). In der Folge verwaltet das Betriebssystem den Kindprozess als eigenständige Instanz des Programms und führt ihn unabhängig vom Elternprozess aus.

Ein Kindprozess arbeitet normalerweise nicht exakt wie der Elternprozess weiter, sondern wählt andere Codepfade (andere Anweisungen).

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 Elternprozess 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 und seine individuelle Prozess ID aus.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int main ()
{
   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 (PID: %d)\n", j, getpid());
        sleep (1);
      }
      exit (0);
   }
   else if (pid > 0)
   { 
      /* Elternprozess
       * Gibt fork einen Wert größer 0 zurück, so ist dies die PID des Elternprozesses
       */
      for (i=0; i < 10; i++)
      {
         printf ("Elternprozess: %d (PID: %d)\n", i, getpid());
         sleep (1);
      }
   }
   else
   {   
      /* Wird ein negativer Wert zurückgegeben, ist ein Fehler aufgetreten */
      fprintf (stderr, "Error");
      exit (1);
   }
   return 0;
}

Mögliche Ausgabe des Programms

Kindprozess:  0 (PID: 11868)
Elternprozess: 0 (PID: 11867)
Kindprozess:  1 (PID: 11868)
Elternprozess: 1 (PID: 11867)
Kindprozess:  2 (PID: 11868)
Elternprozess: 2 (PID: 11867)
Kindprozess:  3 (PID: 11868)
Elternprozess: 3 (PID: 11867)
Kindprozess:  4 (PID: 11868)
Elternprozess: 4 (PID: 11867)
Kindprozess:  5 (PID: 11868)
Elternprozess: 5 (PID: 11867)
Kindprozess:  6 (PID: 11868)
Elternprozess: 6 (PID: 11867)
Kindprozess:  7 (PID: 11868)
Elternprozess: 7 (PID: 11867)
Kindprozess:  8 (PID: 11868)
Elternprozess: 8 (PID: 11867)
Kindprozess:  9 (PID: 11868)
Elternprozess: 9 (PID: 11867) 

Die Reihenfolge der Ausgaben kann variieren, da das Betriebssystem aufgrund verschiedener Kriterien zur Laufzeit entscheidet, welcher Prozess wann und für wie lange auf dem Prozessor ausgeführt wird (Scheduling). Unter anderem spielen dabei die momentane Auslastung der Rechner-Ressourcen, konkurrierende Prozesse (System- wie Anwendungsprogramme), die bereits verbrauchte Rechenzeit oder erduldete Wartezeit eine Rolle. Aus diesen Angaben wird die Priorität eines jeden Prozesses immer wieder neu bewertet. Die ausgegebenen Prozess-IDs werden bei jedem Programm- und Forkaufruf neu vergeben und sind deshalb nur beispielhaft.

Siehe auch

Weblinks

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Diese Seite wurde zuletzt am 15. Mai 2012 um 20:30 Uhr geändert.

Dieser Artikel basiert auf dem Artikel Fork_(Unix) aus der freien Enzyklopädie Wikipedia und ist unter der Lizenz Creative Commons Attribution/Share Alike verfügbar. Zusätzliche Bedingungen können anwendbar sein. In der Wikipedia ist eine Liste der Autoren verfügbar.

TOP



TOP