www.wikidata.de-de.nina.az
In unixoiden Betriebssystemen ist fork der Name eines Systemaufrufs anhand dessen der aufrufende Prozess Elternprozess eine Kopie von sich selbst erzeugt einen sog Kindprozess Der Kindprozess ubernimmt dabei die Daten den Code den Befehlszahler und die Dateideskriptoren vom Elternprozess und erhalt vom Kernel 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 eigenstandige Instanz des Programms und fuhrt ihn unabhangig vom Elternprozess aus Ein Kindprozess arbeitet meistens nicht exakt wie der Elternprozess weiter sondern wahlt andere Codepfade andere Anweisungen An dem Ruckgabewert von fork wird erkannt in welchem Prozess man sich befindet Liefert fork eine 0 zuruck kennzeichnet dies den Kindprozess im Elternprozess wird die PID des Kindes zuruckgeliefert Bei einem Fehler liefert fork einen Wert kleiner 0 und kein Kindprozess wurde erzeugt Inhaltsverzeichnis 1 Beispiel 2 Nutzung von Fork zum Starten anderer Programme 3 Siehe auch 4 Weblinks 5 EinzelnachweiseBeispiel BearbeitenDas folgende Programm ist in der Programmiersprache C geschrieben und soll zeigen wie ein Fork funktioniert Das Beispielprogramm zahlt von 0 bis 9 und gibt den Wert des jeweiligen Prozesses und seine individuelle Prozess ID aus include lt stdio h gt include lt unistd h gt include lt stdlib h gt include lt sys types h gt int main int i j pid t pid pid fork if pid 0 Kindprozess wenn fork eine 0 zuruckgibt befinden wir uns im Kindprozess for j 0 j lt 10 j printf Kindprozess d PID d n j getpid sleep 1 exit 0 else if pid gt 0 Elternprozess Gibt fork einen Wert grosser 0 zuruck befinden wir uns im Elternprozess in pid steht die ID des Kindprozesses getpid gibt die eigene PID zuruck for i 0 i lt 10 i printf Elternprozess d PID d n i getpid sleep 1 else Wird ein negativer Wert zuruckgegeben ist ein Fehler aufgetreten fprintf stderr Fehler exit 1 return 0 Mogliche 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 fur wie lange auf dem Prozessor ausgefuhrt 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 Prioritat eines jeden Prozesses immer wieder neu bewertet Die ausgegebenen Prozess IDs werden bei jedem Programm und Forkaufruf neu vergeben und sind deshalb nur beispielhaft Nutzung von Fork zum Starten anderer Programme BearbeitenFork 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 B execve auf wodurch der aufrufende Prozess durch das gewunschte Programm ersetzt wird Ein Beispiel der Benutzer hat eine Shell geoffnet und mochte sich mittels des Befehls a href Ls Unix html title Ls Unix ls a den aktuellen Verzeichnisinhalt anzeigen lassen Er tippt also ls ein Daraufhin passiert vereinfacht dargestellt Folgendes Die Shell ruft fork auf und erzeugt dadurch wie oben beschrieben einen neuen Kindprozess eine Kopie von sich selbst Der neu erzeugte Kindprozess ruft nun den Befehl execve bin ls auf Hierdurch wird der Kindprozess durch das Programm ls ersetzt Der so neu erzeugte ls Prozess der immer noch ein Kind der Shell ist wird ausgefuhrt Die Verwendung von fork erlaubt es dem Kindprozess vor dem Aufruf von execve seine Dateideskriptoren anzupassen um somit beispielsweise die Ein Ausgabe stdin stdout stderr umzulenken 1 Siehe auch BearbeitenForkbombWeblinks BearbeitenWhat does fork do Einzelnachweise Bearbeiten Andrew S Tanenbaum Modern Operating Systems Second Edition ISBN 0 13 092641 8 S 75 Abgerufen von https de wikipedia org w index php title Fork Unix amp oldid 230399870