<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Fork_%28Unix%29</id>
	<title>Fork (Unix) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Fork_%28Unix%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Fork_(Unix)&amp;action=history"/>
	<updated>2026-06-01T01:19:20Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Fork_(Unix)&amp;diff=742405&amp;oldid=prev</id>
		<title>imported&gt;SchlurcherBot: Bot: http → https</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Fork_(Unix)&amp;diff=742405&amp;oldid=prev"/>
		<updated>2025-06-10T20:16:05Z</updated>

		<summary type="html">&lt;p&gt;Bot: http → https&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;In [[Unixoides System|unixoiden Betriebssystemen]] ist &amp;#039;&amp;#039;&amp;#039;fork&amp;#039;&amp;#039;&amp;#039; der Name eines [[Systemaufruf]]s, anhand dessen der aufrufende [[Prozess (Informatik)|Prozess]] (Elternprozess) eine Kopie von sich selbst erzeugt, einen sog. Kindprozess. Der Kindprozess übernimmt dabei die [[Datensegment|Daten]], den [[Codesegment|Code]], den [[Befehlszähler]] und die [[Handle#Datei-Handle|Dateideskriptoren]] vom Elternprozess und erhält vom Kernel (wie der Elternprozess und jeder andere Prozess auch) eine eigene Prozessnummer, die [[Prozess ID|PID]] (engl. „&amp;#039;&amp;#039;P&amp;#039;&amp;#039;rocess &amp;#039;&amp;#039;ID&amp;#039;&amp;#039;entifier“).&lt;br /&gt;
In der Folge verwaltet das Betriebssystem den Kindprozess als eigenständige Instanz des Programms und führt ihn unabhängig vom Elternprozess aus.&lt;br /&gt;
&lt;br /&gt;
Ein Kindprozess arbeitet meistens nicht exakt wie der Elternprozess weiter, sondern wählt andere Codepfade (andere Anweisungen).&lt;br /&gt;
&lt;br /&gt;
An dem Rückgabewert von &amp;lt;span style=&amp;quot;font-family:monospace; font-size:15px;&amp;quot;&amp;gt;fork()&amp;lt;/span&amp;gt; wird erkannt, in welchem Prozess man sich befindet. Liefert &amp;lt;span style=&amp;quot;font-family:monospace; font-size:15px;&amp;quot;&amp;gt;fork()&amp;lt;/span&amp;gt; eine 0 zurück, kennzeichnet dies den Kindprozess, im Elternprozess wird die PID des Kindes zurückgeliefert. Bei einem Fehler liefert &amp;lt;span style=&amp;quot;font-family:monospace; font-size:15px;&amp;quot;&amp;gt;fork()&amp;lt;/span&amp;gt; einen Wert kleiner 0 und kein Kindprozess wurde erzeugt.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Das folgende Programm ist in der Programmiersprache  [[C (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.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main ()&lt;br /&gt;
{&lt;br /&gt;
   int i, j;&lt;br /&gt;
   pid_t pid;&lt;br /&gt;
&lt;br /&gt;
   pid = fork();&lt;br /&gt;
&lt;br /&gt;
   if (pid == 0)&lt;br /&gt;
   {&lt;br /&gt;
      /* Kindprozess&lt;br /&gt;
       * wenn fork() eine 0 zurückgibt, befinden wir uns im Kindprozess&lt;br /&gt;
       */&lt;br /&gt;
      for (j=0; j &amp;lt; 10; j++)&lt;br /&gt;
      {&lt;br /&gt;
        printf (&amp;quot;Kindprozess:  %d (PID: %d)\n&amp;quot;, j, getpid());&lt;br /&gt;
        sleep (1);&lt;br /&gt;
      }&lt;br /&gt;
      exit (0);&lt;br /&gt;
   }&lt;br /&gt;
   else if (pid &amp;gt; 0)&lt;br /&gt;
   {&lt;br /&gt;
      /* Elternprozess&lt;br /&gt;
       * Gibt fork() einen Wert größer 0 zurück, befinden wir uns im Elternprozess&lt;br /&gt;
       * in pid steht die ID des Kindprozesses&lt;br /&gt;
       * getpid() gibt die eigene PID zurück&lt;br /&gt;
       */&lt;br /&gt;
      for (i=0; i &amp;lt; 10; i++)&lt;br /&gt;
      {&lt;br /&gt;
         printf (&amp;quot;Elternprozess: %d (PID: %d)\n&amp;quot;, i, getpid());&lt;br /&gt;
         sleep (1);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      /* Wird ein negativer Wert zurückgegeben, ist ein Fehler aufgetreten */&lt;br /&gt;
      fprintf (stderr, &amp;quot;Fehler&amp;quot;);&lt;br /&gt;
      exit (1);&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mögliche Ausgabe des Programms:&lt;br /&gt;
 Kindprozess:  0 (PID: 11868)&lt;br /&gt;
 Elternprozess: 0 (PID: 11867)&lt;br /&gt;
 Kindprozess:  1 (PID: 11868)&lt;br /&gt;
 Elternprozess: 1 (PID: 11867)&lt;br /&gt;
 Kindprozess:  2 (PID: 11868)&lt;br /&gt;
 Elternprozess: 2 (PID: 11867)&lt;br /&gt;
 Kindprozess:  3 (PID: 11868)&lt;br /&gt;
 Elternprozess: 3 (PID: 11867)&lt;br /&gt;
 Kindprozess:  4 (PID: 11868)&lt;br /&gt;
 Elternprozess: 4 (PID: 11867)&lt;br /&gt;
 Kindprozess:  5 (PID: 11868)&lt;br /&gt;
 Elternprozess: 5 (PID: 11867)&lt;br /&gt;
 Kindprozess:  6 (PID: 11868)&lt;br /&gt;
 Elternprozess: 6 (PID: 11867)&lt;br /&gt;
 Kindprozess:  7 (PID: 11868)&lt;br /&gt;
 Elternprozess: 7 (PID: 11867)&lt;br /&gt;
 Kindprozess:  8 (PID: 11868)&lt;br /&gt;
 Elternprozess: 8 (PID: 11867)&lt;br /&gt;
 Kindprozess:  9 (PID: 11868)&lt;br /&gt;
 Elternprozess: 9 (PID: 11867)&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Nutzung von Fork zum Starten anderer Programme ==&lt;br /&gt;
Fork wird auch genutzt, um andere Programme (also keine Kopien des aufrufenden Programms) zu starten. Hierzu ruft nach dem Fork einer der Prozesse (in der Regel der Kindprozess) einen entsprechenden Befehl (z.&amp;amp;nbsp;B. [[Exec (Unix)|execve]]) auf, wodurch der aufrufende Prozess durch das gewünschte Programm ersetzt wird. Ein Beispiel: der Benutzer hat eine [[Unix-Shell|Shell]] geöffnet und möchte sich mittels des Befehls &amp;lt;code&amp;gt;[[ls (Unix)|ls]]&amp;lt;/code&amp;gt; den aktuellen Verzeichnisinhalt anzeigen lassen. Er tippt also&lt;br /&gt;
  ls&lt;br /&gt;
ein. Daraufhin passiert (vereinfacht dargestellt) Folgendes:&lt;br /&gt;
# Die Shell ruft &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;fork()&amp;lt;/span&amp;gt; auf und erzeugt dadurch wie oben beschrieben einen neuen Kindprozess (eine Kopie von sich selbst).&lt;br /&gt;
# Der neu erzeugte Kindprozess ruft nun den Befehl &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;execve(&amp;quot;/bin/ls&amp;quot;)&amp;lt;/span&amp;gt; auf. Hierdurch wird der Kindprozess durch das Programm &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;ls&amp;lt;/span&amp;gt; ersetzt.&lt;br /&gt;
# Der so neu erzeugte &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;ls&amp;lt;/span&amp;gt;-Prozess (der immer noch ein Kind der Shell ist) wird ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Die Verwendung von &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;fork()&amp;lt;/span&amp;gt; erlaubt es dem Kindprozess, vor dem Aufruf von &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;execve()&amp;lt;/span&amp;gt; seine [[Datei-Handle|Dateideskriptoren]] anzupassen, um somit beispielsweise die Ein-Ausgabe ([[Standard-Datenströme|stdin, stdout, stderr]]) umzulenken.&amp;lt;ref name=&amp;quot;Modern Operating Systems&amp;quot;&amp;gt;Andrew S. Tanenbaum: &amp;#039;&amp;#039;Modern Operating Systems&amp;#039;&amp;#039;. Second Edition. ISBN 0-13-092641-8, S. 75&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Forkbomb]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://www.unixguide.net/unix/programming/1.1.1.shtml What does fork() do?]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Unix-Betriebssystemkomponente]]&lt;/div&gt;</summary>
		<author><name>imported&gt;SchlurcherBot</name></author>
	</entry>
</feed>