Gabel in Bash

Naila Saad Siddiqui 15 Februar 2024
Gabel in Bash

Dieser Artikel enthält ein einführendes Tutorial zu einem Bash-Äquivalent (d. h. Subshells) für den C/C++ fork-Systemaufruf zum Forken neuer asynchroner untergeordneter Prozesse.

Gabel in Bash

Der Systemaufruf in C/C++ besteht darin, einen neuen Prozess zu erstellen, d. h. den untergeordneten Prozess des aufrufenden Prozesses. Nach der Erstellung des neuen Prozesses werden beide Prozesse asynchron ausgeführt.

Beide haben ihren eigenen Adressraum. Keiner der Prozesse wartet darauf, dass der andere Prozess endet, bevor seine Ausführung endet; In Bash werden diese untergeordneten Prozesse jedoch als Subshells bezeichnet.

Diese Subshells werden parallel ausgeführt, sodass mehrere Aufgaben gleichzeitig ausgeführt werden können. Daher kann die fork-Funktionalität in Bash durch das Erstellen neuer Subshells erreicht werden.

Um eine Unterschale zu erstellen, folgen wir der folgenden Syntax:

(sub_process) &

Wir schließen die Funktion oder beliebige Codezeilen, die als Unterprozess ausgeführt werden sollen, in Klammern ein und setzen dann ein kaufmännisches Und-Zeichen &. Alle Anweisungen in diesen Klammern bilden einen Unterprozess und werden als Subshell ausgeführt.

Betrachten Sie das folgende Beispiel:

Fork im Bash-Skript 1

In diesem Beispiel haben wir die Funktion child_process() erstellt und einige Anweisungen geschrieben. Später haben wir diese Funktion aufgerufen, indem wir sie in Klammern gesetzt und am Ende ein & gesetzt haben.

Dadurch wird die Funktion in einer Subshell aufgerufen. Die Parent-Shell führt ihre nächsten Anweisungen gleichzeitig aus.

Fork in Bash-Ausgabe 1

Wir können aus der Ausgabe ersehen, dass der übergeordnete Prozess (da er gleichzeitig lief) seine nächste Anweisung druckte, bevor der untergeordnete Prozess sich seiner print-Anweisung nähern konnte.

Variablen in Subshells

Was die Variablen betrifft, so haben alle Shells, ob Eltern- oder Subshell, ihre Variablen. Da beide ihren eigenen Adressraum haben, wird der Prozess schließlich separate lokale Variablen haben.

Sehen wir uns das folgende Beispiel an:

Fork in Bash-Skript 2

In diesem Skript haben wir im übergeordneten Prozess eine Variable local_var erstellt und ihren Wert gesetzt. Später in der Funktion child_process haben wir ihr einen neuen Wert für die Subshell zugewiesen.

Nach dem Erstellen eines untergeordneten Prozesses druckt der übergeordnete Prozess den Wert der Variablen, sodass der Wert des übergeordneten Prozesses gedruckt wird.

Die Ausgabe wird wie folgt sein:

Fork in Bash-Ausgabe 2

Aus der obigen Ausgabe können wir ersehen, dass auf die lokalen Variablen außerhalb des Codeblocks des untergeordneten Prozesses nicht zugegriffen werden kann. Selbst der übergeordnete Prozess kann nicht auf den vom untergeordneten Prozess festgelegten Wert zugreifen.