WikiDer > Fork (Informatik)

Fork (informatica)

EIN Gabel ist ein Konzept aus dem Informatik was bedeutet, dass a Prozess macht eine Kopie von sich selbst.

Wenn ein Programm möchte einen neuen Prozess starten, der gleichzeitig (auch . genannt) parallel oder Wettbewerber aufgerufen) mit dem Prozess des Programms selbst ausgeführt wird, kann es Betriebssystem durch die SystemaufrufGabel() weisen Sie es an, eine Gabelung auszuführen.

Das Betriebssystem erstellt dann einen neuen Prozess, der eine exakte Kopie des Prozesses ist, der einen Fork bestellt hat, einschließlich des Programmcodes, des (Inhalts) der Variablen und die Inhalte der dem Programm zugeordneten Speichersegmente. Der einzige Unterschied besteht darin, dass das neue Verfahren ein anderes Prozesskennung (PID).

Der neue Prozess (der Kindprozess) wird nun sofort gestartet und beginnt mit der nächsten Anweisung nach der Gabelung. Auch der ursprüngliche Prozess (der Erziehungsprozess) setzt sich mit der Ausführung fort und natürlich auch mit der nächsten Anweisung nach dem Fork. Es gibt also jetzt zwei fast identische Prozesse, die nur eine unterschiedliche PID haben.

Da beide Prozesse denselben Code verwenden, den des ursprünglichen Prozesses, der den Fork ausgeführt hat, muss dieser Code sowohl die Funktionalität des Elternprozesses als auch die des Kindprozesses enthalten. Welche von beiden ausgeführt werden soll, wird durch den Rückgabewert von fork() bestimmt: im Kindprozess liefert fork() als Rückgabewert den Wert 0 und im Elternprozess die PID des neu erstellten Prozesses (er ist immer größer als 0: die Prozess-ID 0 ist für das Special reserviert drinProzess, der während des Systemstarts erstellt wurde).

In vielen Fällen ist die Gabel jedoch zum Starten eines anderen Programms mit a ausführender Anruf. Die Wörter Gabel und ausführender werden daher oft in einem Atemzug genannt.

Beispiel

Unten CProgramm verwendet fork(), um einen neuen Prozess zu starten. Im Elternprozess gibt fork() einen Wert größer als 0 zurück und wird zu einer Schleife ein ausgeführt, was 10 mal "Elternprozess" ausgibt. Im Kindprozess liefert fork() den Wert 0 und loop B ausgeführt, wodurch "Child Process" 10 Mal auf dem Bildschirm angezeigt wird. Beide Schleifen warten jeweils eine Sekunde zwischen dem Drucken.

#einschließen<stdio.h>#einschließen<unistd.h>intMain(Leere){intich,pid;pid=Gabel();wenn(pid>0){// fork() hat eine PID > 0 zurückgegeben: Dies ist der übergeordnete Prozessdruckenf("Prozess-ID des untergeordneten Prozesses: %d",pid);zum(ich=0;ich<10;ich){// Schleife Aschlafen(1);druckenf("Übergeordneter Prozess: %d",ich);}}sonstwenn(pid==0){// fork() hat eine PID zurückgegeben == 0: Dies ist der Kindprozesszum(ich=0;ich<10;ich){// Schleife Bschlafen(1);druckenf("Kinderprozess: %d",ich);}}sonst{// fork() hat eine PID < 0 zurückgegeben: Es wurde kein Prozess erstelltdruckenf("kein Prozess erstellt; Antwort: %d",pid);}}

Der Elternprozess gibt auch die Prozess-ID des neuen Kindprozesses aus. Beachten Sie, dass dies jedes Mal ein anderer Wert ist: Wir wissen nur, dass er immer größer als 0 ist, wenn ein neuer Prozess erfolgreich gestartet wurde. Wenn es aus irgendeinem Grund nicht möglich war, einen neuen Prozess zu starten, gibt fork() einen Rückgabewert kleiner als 0 zurück.

Unterstützung

Die Fork-Funktionalität und der zugehörige Systemaufruf sind in allen Betriebssystemen der UnixFamilie, einschließlich Linux, BSD und Mac OS X. Microsoft Windows hat diese Funktion nicht. Windows hat natürlich Systemaufrufe, um neue Prozesse zu erstellen, aber diese geben einen "neuen" Prozess und keine Kopie des ursprünglichen Prozesses zurück. Dies ist ähnlich der obigen Kombination von combination Gabel und ausführender auf Unix-Systemen.

Siehe auch

Externer Link