Systemaufrufe

Fork Systemaufruf Linux

Fork Systemaufruf Linux

Gabelsystemaufruf

Der fork-Systemaufruf wird verwendet, um einen neuen Prozess zu erstellen. Der neu erstellte Prozess ist der untergeordnete Prozess. Der Prozess, der fork aufruft und einen neuen Prozess erstellt, ist der übergeordnete Prozess. Die Child- und Parent-Prozesse werden gleichzeitig ausgeführt.

Aber die Child- und Parent-Prozesse befinden sich auf unterschiedlichen Speicherplätzen. Diese Speicherbereiche haben den gleichen Inhalt und jede Operation, die von einem Prozess ausgeführt wird, wirkt sich nicht auf den anderen Prozess aus.

Wenn die untergeordneten Prozesse erstellt werden; Jetzt haben beide Prozesse denselben Programmzähler (PC), sodass beide Prozesse auf denselben nächsten Befehl zeigen point. Die vom übergeordneten Prozess geöffneten Dateien sind die gleichen wie für den untergeordneten Prozess same.

Der untergeordnete Prozess ist genau derselbe wie sein übergeordneter Prozess, es gibt jedoch Unterschiede in den Prozess-IDs:

  1. Die Prozess-ID des untergeordneten Prozesses ist eine eindeutige Prozess-ID, die sich von den IDs aller anderen vorhandenen Prozesse unterscheidet.
  2. Die Prozess-ID des Elternteils ist dieselbe wie die Prozess-ID des Elternteils des Kindes child.

Eigenschaften des untergeordneten Prozesses

Im Folgenden sind einige der Eigenschaften aufgeführt, die ein untergeordneter Prozess enthält:

  1. Die CPU-Zähler und die Ressourcenauslastung werden auf Null zurückgesetzt.
  2. Wenn der Elternprozess beendet wird, erhalten die Kindprozesse kein Signal, da das PR_SET_PDEATHSIG-Attribut in prctl() zurückgesetzt wird.
  3. Der Thread, der zum Aufrufen von fork() verwendet wird, erstellt den Kindprozess. Die Adresse des untergeordneten Prozesses ist also dieselbe wie die des übergeordneten Prozesses.
  4. Der Dateideskriptor des Elternprozesses wird vom Kindprozess geerbt. Zum Beispiel werden der Offset der Datei oder der Status von Flags und die I/O-Attribute zwischen den Dateideskriptoren von Kind- und Elternprozessen geteilt. Der Dateideskriptor der übergeordneten Klasse bezieht sich also auf denselben Dateideskriptor der untergeordneten Klasse.
  5. Die Deskriptoren der offenen Nachrichtenwarteschlange des Elternprozesses werden vom Kindprozess geerbt. Wenn beispielsweise ein Dateideskriptor eine Nachricht im übergeordneten Prozess enthält, wird dieselbe Nachricht im entsprechenden Dateideskriptor des untergeordneten Prozesses vorhanden sein. Wir können also sagen, dass die Flagwerte dieser Dateideskriptoren gleich sind.
  6. In ähnlicher Weise werden offene Verzeichnisströme von den untergeordneten Prozessen geerbt.
  7. Der standardmäßige Timer-Slack-Wert der untergeordneten Klasse entspricht dem aktuellen Timer-Slack-Wert der übergeordneten Klasse of.

Eigenschaften, die nicht vom Child-Prozess geerbt werden

Im Folgenden sind einige der Eigenschaften aufgeführt, die nicht von einem untergeordneten Prozess geerbt werden:

  1. Speichersperren
  2. Das anstehende Signal einer untergeordneten Klasse ist leer.
  3. Zugehörige Datensatzsperren verarbeiten (fcntl())
  4. Asynchrone E/A-Operationen und E/A-Inhalte.
  5. Benachrichtigungen zu Verzeichnisänderungen.
  6. Timer wie alarm(), setitimer() werden nicht von der untergeordneten Klasse geerbt.

Gabel() in C

Es gibt keine Argumente in fork() und der Rückgabetyp von fork() ist integer. Sie müssen die folgenden Header-Dateien einschließen, wenn fork() verwendet wird:

#einschließen
#einschließen
#einschließen

Beim Arbeiten mit fork(), verwendbar für Typ pid_t für Prozess-IDs wie pid_t ist definiert in .

Die Header-Datei ist, wo fork () definiert ist, also müssen Sie es in Ihr Programm einbinden, um fork () zu verwenden.

Der Rückgabetyp ist definiert in und fork() Aufruf ist definiert in . Daher müssen Sie beide in Ihr Programm aufnehmen, um den Systemaufruf fork() zu verwenden.

Syntax von fork()

Die Syntax des Systemaufrufs fork() in Linux, Ubuntu ist wie folgt:

pid_t fork(leer);

In der Syntax lautet der Rückgabetyp pid_t. Wenn der untergeordnete Prozess erfolgreich erstellt wurde, wird die PID des untergeordneten Prozesses im übergeordneten Prozess zurückgegeben und 0 wird an den untergeordneten Prozess selbst zurückgegeben.

Wenn ein Fehler auftritt, wird -1 an den übergeordneten Prozess zurückgegeben und der untergeordnete Prozess wird nicht erstellt.

Es werden keine Argumente an fork() übergeben. 

Beispiel 1: Aufruf von fork()

Betrachten Sie das folgende Beispiel, in dem wir den Systemaufruf fork() verwendet haben, um einen neuen untergeordneten Prozess zu erstellen:

CODE:

#einschließen
#einschließen
#einschließen
int main()

Gabel();
printf("Systemaufruf fork() verwenden\n");
0 zurückgeben;

AUSGABE:

Verwenden des Systemaufrufs fork()
Verwenden des Systemaufrufs fork()

In diesem Programm haben wir fork() verwendet, dies erstellt einen neuen Kindprozess. Wenn der Kindprozess erstellt wird, zeigen sowohl der Elternprozess als auch der Kindprozess auf die nächste Anweisung (gleicher Programmzähler). Auf diese Weise werden die verbleibenden Anweisungen oder C-Anweisungen so oft wie möglich ausgeführt, d. h. 2nein mal, wobei n die Anzahl der fork()-Systemaufrufe ist.

Wenn der fork()-Aufruf einmal wie oben verwendet wird (21 = 2) wir werden unsere Ausgabe 2 mal haben.

Wenn der Systemaufruf fork() verwendet wird, sieht die interne Struktur hier wie folgt aus:

Betrachten Sie den folgenden Fall, in dem fork() viermal verwendet wird:

CODE:

#einschließen
#einschließen
#einschließen
int main()

Gabel();
Gabel();
Gabel();
Gabel();
printf("Systemaufruf fork() verwenden");
0 zurückgeben;

Ausgabe:

fork()-Systemaufruf verwenden fork()-Systemaufruf verwenden fork()-Systemaufruf verwenden fork()-Systemaufruf verwenden fork()-Systemaufruf verwenden fork()-Systemaufruf verwenden fork()-Systemaufruf verwenden fork()-Systemaufruf verwenden fork () Systemaufruf Verwendung des Systemaufrufs fork() Verwenden des Systemaufrufs fork() Verwenden des Systemaufrufs fork() Verwenden des Systemaufrufs fork() Verwenden des Systemaufrufs fork() Verwenden des Systemaufrufs fork() Verwenden des Systemaufrufs fork() 

Jetzt ist die Gesamtzahl der erstellten Prozesse 24 = 16 und wir haben unsere print-Anweisung 16 Mal ausgeführt.

Beispiel 2: Testen, ob fork() erfolgreich war

Im folgenden Beispiel haben wir das Entscheidungskonstrukt verwendet, um den von fork() zurückgegebenen Wert (int) zu testen. Und die entsprechenden Meldungen werden angezeigt:

CODE:

#einschließen
#einschließen
#einschließen
int main()

pid_tp;
p = Gabel();
wenn(p==-1)

printf("Beim Aufrufen von fork() ist ein Fehler aufgetreten");

wenn(p==0)

printf("Wir sind im Kindprozess");

sonst

printf("Wir sind im Elternprozess");

0 zurückgeben;

AUSGABE:

Wir sind im Elternprozess
Wir sind im Kinderprozess

Im obigen Beispiel haben wir den Typ pid_t verwendet, der den Rückgabewert von fork() speichert. fork() wird online aufgerufen:

p = Gabel();

Der von fork() zurückgegebene Integer-Wert wird also in p gespeichert und dann wird p verglichen, um zu überprüfen, ob unser fork()-Aufruf erfolgreich war.

Wenn der Aufruf fork() verwendet wird und der untergeordnete Prozess erfolgreich erstellt wurde, wird die ID des untergeordneten Prozesses an den übergeordneten Prozess zurückgegeben und 0 wird an den untergeordneten Prozess zurückgegeben.Die ID des untergeordneten Prozesses im übergeordneten Prozess ist nicht dieselbe wie die ID des untergeordneten Prozesses im untergeordneten Prozess selbst. Im untergeordneten Prozess ist die ID des untergeordneten Prozesses 0.

Mit diesem Tutorial können Sie sehen, wie Sie mit dem Fork-Systemaufruf in Linux beginnen.

So verwenden Sie den rm-Befehl unter Linux
Der Befehl rm wird verwendet, um Dateien und Verzeichnisse in Linux zu entfernen. Dies ist einer der Befehle, die Sie als Linux-Systemadministrator ke...
Finden Sie den Pfad eines Befehls mit whereis
wo ist wird verwendet, um den Pfad der Linux-Binärdatei /ausführbaren Dateien, Quelldateien und Manpage-Dateien zu finden.Es gibt viele Linux-Distribu...
So verwenden Sie den mkdir-Befehl unter Linux
Der Befehl mkdir wird verwendet, um neue Verzeichnisse in Linux zu erstellen.  In diesem Artikel zeige ich Ihnen, wie Sie den Befehl mkdir verwenden, ...