Fork (Unix)


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 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 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)
   { 
      /* 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 (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)
Vaterprozess: 0 (PID: 11867)
Kindprozess:  1 (PID: 11868)
Vaterprozess: 1 (PID: 11867)
Kindprozess:  2 (PID: 11868)
Vaterprozess: 2 (PID: 11867)
Kindprozess:  3 (PID: 11868)
Vaterprozess: 3 (PID: 11867)
Kindprozess:  4 (PID: 11868)
Vaterprozess: 4 (PID: 11867)
Kindprozess:  5 (PID: 11868)
Vaterprozess: 5 (PID: 11867)
Kindprozess:  6 (PID: 11868)
Vaterprozess: 6 (PID: 11867)
Kindprozess:  7 (PID: 11868)
Vaterprozess: 7 (PID: 11867)
Kindprozess:  8 (PID: 11868)
Vaterprozess: 8 (PID: 11867)
Kindprozess:  9 (PID: 11868)
Vaterprozess: 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


Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • UNIX — Ken Thompson und Dennis Ritchie Basisdaten Entwickler …   Deutsch Wikipedia

  • Fork — (englisch ‚Gabel‘, ‚Verzweigung‘) bezeichnet: einen durch das Betriebssystem bereitgestellten Systemaufruf, durch den ein Folgeprozess gestartet wird, siehe Fork (Unix) in der Softwareentwicklung eine Abspaltung von einem (Haupt )Projekt, siehe… …   Deutsch Wikipedia

  • UNIX pipes — Die Pipe (englisch für Rohr, Röhre) bezeichnet einen gepufferten uni oder bidirektionalen Datenstrom zwischen zwei Prozessen nach dem „First In – First Out“ Prinzip. Das heißt vereinfacht, dass die Ausgabe eines Prozesses (ein Programm in… …   Deutsch Wikipedia

  • Fork — У этого термина существуют и другие значения, см. Форк (значения). В Unix системах, fork()  системный вызов, создающий новый процесс( потомок), который является почти точной копией процесса( родителя), выполняющего этот вызов. Между… …   Википедия

  • Fork-exec — is a commonly used technique in Unix whereby an executing process spawns a new program. fork() is the name of the system call that the parent process uses to divide itself ( fork ) into two identical processes. After calling fork(), the created… …   Wikipedia

  • Fork Bomb — Schéma de la bombe logique : un processus est forké de manière récursive jusqu à saturer les ressources et aboutir à un plantage ou un déni de service La fork bomb est une forme d attaque par déni de service contre un système informatique… …   Wikipédia en Français

  • Unix — Kommandozeile (Unix Prompt) Basisdaten Entwickler Ken Thompso …   Deutsch Wikipedia

  • Fork-бомба — Рекурсивное порождение процессов, ведущее к отказу в обслуживании или падению системы fork бомба  вредоносная или ошибочно написанная программа, бесконечно создающая свои копии (системным вызовом fork()), которые обычно также начинают… …   Википедия

  • Fork (operating system) — In computing, when a process forks, it creates a copy of itself, which is called a child process. The original process is then called the parent process . More generally, a fork in a multithreading environment means that a thread of execution is… …   Wikipedia

  • Fork (software development) — In software engineering, a project fork happens when developers take a legal copy of source code from one software package and start independent development on it, creating a distinct piece of software. The term implies a split in the developer… …   Wikipedia


We are using cookies for the best presentation of our site. Continuing to use this site, you agree with this.