POSIX spawn mit C -Programmierung

POSIX spawn mit C -Programmierung
Spawn ist eine Funktion, die in POSIX verwendet wird, um untergeordnete Prozesse zu laden und auszuführen. Der aktuell ausgeführte Prozess in POSIX wird dann diese Kinderprozesse und andere Prozesse asynchron fortsetzen oder nicht weiter ausführen. Immer wenn ein neuer Unterprozess erstellt wird. In Microsoft Windows, Unix und Linux gibt es eine bestimmte Familie von Spawns. und andere Familien von Spawn -Funktionen werden als optionale Erweiterung angesehen.

Warum POSIX Spawn verwenden?

Der posix_spawn () Und pox_spawnp () Funktionen werden verwendet, um einen neuen Kinderprozess zu erstellen. Der untergeordnete Prozess führt dann eine Datei aus. Diese Funktionen wurden von POSIX spezifiziert, um die Methode zum Erstellen neuer Prozesse für Maschinen zu standardisieren, die keinen Fork -System -Aufrufunterstützung haben. Diese Maschinen sind normalerweise klein und fehlen die eingebetteten Systeme für die LMMU -Unterstützung.

Die beiden Funktionen kombinieren Gabel und Exec mit einigen zusätzlichen Schritten, die das Kind ausführen. Sie wirken als Teilmenge von Funktionen, die normalerweise mit einer Gabel erreicht werden, für alle Systemaufrufe und eingebetteten Systeme, denen solche Funktionen fehlen.

Beispiel 1: pox_spawn ()

In diesem Beispiel werden wir die Funktion Spawn () verwenden, um einen neuen Kinderprozess zu erstellen und auszuführen. Dann werden wir alle in der Funktion verwendeten relevanten Argumente erklären.

Die im Beispiel verwendeten Argumente sind wie folgt:

Streit Beschreibung
Wird verwendet, um alle Spawn -Ausführungsoperationen zu definieren.
Weg Der Name des Pfades, der ausgeführt werden soll.
FD_COUNT Die Anzahl der Einträge mit dem Array von FD_MAP. Wenn FD_COUNT gleich 0 ist, wird die FD_MAP ignoriert. In solchen Fällen erbt der untergeordnete Prozess alle Dateideskriptoren und ignoriert diejenigen, die geändert wurden.
fd_map
Eine Reihe von Dateideskriptoren, die vom untergeordneten Prozess vererbt werden sollen. Wenn der Wert von FD_COUNT nicht 0 ist, ist FD_MAP erforderlich, um die Deskriptoren der FD_COUNT -Datei auf einen höchsten Wert von Open_MAX zu bringen. Es hat:

· Die Kinderprozesseingabe

· Die Ausgabe

· Die Fehlerwerte

erben Die Strukturvererbung zeigt, dass Benutzer möchten, dass ihr Kinderprozess alles vom Elternteil erbt.
argv Der Zeiger auf einen bestimmten Argumentvektor. Der Wert von Argv [0] kann nicht null sein und muss der Dateiname sein, der geladen wird. Der Argv -Wert kann Null nicht gleich sein.
Envp Zeigt auf eine Reihe von Charakterzeigern. Jeder der Zeiger in diesem Array zeigt auf eine Umgebungsvariable. Der Endpunkt des Arrays ist ein Nullzeiger.

Beispiel 2: Test.C

Im folgenden Beispiel wird ein neuer Kinderprozess erstellt, um den Befehl durch auszuführen /bin/sh -c. Dies ist der Wert, der als erstes Argument übergeben wurde. Der prüfen.C Code ist wie folgt:

Im obigen Beispiel haben wir die Bibliotheken angerufen und dann die genannt laichen.H Header. Sie werden auch das sehen posix_spawn () Aufgerufen, um im obigen Beispiel einen untergeordneten Prozess zu erstellen. Der laichen Und Spawnp Funktionen werden anstelle des Gabel Und Geschäftsführer Funktionen. Laichen() hat Flexibilität und bietet den Benutzern in vielerlei Hinsicht viel Leichtigkeit. Es ist etwas unähnlich von System() Und exec (). Es wird zurückkehren und den frischen Kinderprozess erstellen. In unserem Beispiel ist es PID. Oben können Sie sehen, dass die Wartefunktion waitpid (), Dann System() wird eingesetzt. Beachten Sie, dass die laichen() Und Gabel() Das Aufrufen von Prozessen ist gleich und die Implementierungsmethode ist für beide Funktionen mehr oder weniger gleich.

Wir werden jetzt das Beispiel mit a ausführen GCC Compiler. Sie können auch einen anderen Compiler Ihrer Wahl verwenden:

$ sudo gcc Test.c -lrt

Führen Sie als nächstes Folgendes aus:

$ ./A.aus

Die Ausgabe des obigen Befehls sieht wie folgt aus:

Das Kind PID wird erstellt, wie Sie in der obigen Ausgabe sehen können.

Bibliothek

Libc: Verwenden Sie das -l C, um die zu verknüpfen GCC Compiler. Beachten Sie hier, dass diese Bibliothek automatisch enthalten ist.

Laichen()

Der laichen() Die Funktion basiert auf POSIX 1003.1d Draft Standard verwendet als posix_spawn (). Die C -Bibliothek enthält Spawn*() Funktionen. Hier werden wir ein paar Suffixe zusammen mit ihren Beschreibungen auflisten:

E: Wird als Array für Umgebungsvariablen verwendet.

L: Wird als null-terminierte Liste der im Programm verwendeten Argumente verwendet.

P: verwendet, um einen relativen Weg zu definieren. Wenn der Pfad keinen Schrägstrich in seinem Wert hat, verwendet das System die Pfadumgebungsvariable für ein ähnliches Programm.

v: fungiert als Argumentenvektor im Programm.

Zuordnungsdateideskriptoren

In laichen(), Wir üben die FD_COUNT Und fd_map Argumente zum Aufrufen der Dateideskriptoren. Es gibt an, welches Kind zu erben soll.

Die als Dateideskriptor verwendete Nummer für den untergeordneten Prozess hängt von ihrem Standort innerhalb der fd_map. Hier werden wir das Beispiel des übergeordneten mit Dateideskriptoren bewertet 1, 3 und 5 betrachten, dann wird die Zuordnung ungefähr so ​​sein:

>> int fd_map = 1, 3, 5;
Für das Kind Für den Elternteil
0 1
1 3
2 5

Beachten Sie, dass wenn Sie die explizit verwenden fd_map Um diese Dateideskriptoren mit dem Kind und übergeordnet zu machen, müssen Sie das zuordnen SPWAN_FDCLOSE Funktionieren Sie fort.

Erbflaggen

In Spawn müssen Benutzer im Falle einer Erbschaft eine der folgenden Flaggen aufrufen. Einige Beispiele für Spawn -Flags und ihre Beschreibungen sind unten angegeben:

Flagge Beschreibung
Spawn_align_default Dieses Flag wird verwendet, um die Standardeinstellungen des Setups für die Ausrichtung einzurichten.
Spawn_align_fault Dieses Flag wird zur Fehlerausrichtung der Datenreferenzen verwendet.
Spawn_align_nofault Diese Flagge wird verwendet, um die Fehlerfehlausrichtung zu beheben.
Spawn_debug Diese Flagge wird verwendet, um den Kernel zu debuggen.
Spawn_exec Spawn wirkt wie exec*() mit dieser Flagge.
Spawn_explicit_cpu Dieses Flag wird verwendet, um die Laufmaske festzulegen und das Maskenmaske -Run -Maskenelement zu erben.
Spawn_explicit_Sching Dieses Flag wird verwendet, um die Planungsrichtlinie festzulegen.

Der <laichen.H> definiert diese Maske Spawn_align_mask Wird verwendet, um die oben aufgeführten Flags auszurichten.

pid_t pGroup Die untergeordnete Prozessgruppe Wenn Sie die spawn_setgroup im Flag -Mitglied angeben.
int runmask Die Runmask des Kinderprozesses, um die Masken zu erben, die auf der Grundlage des Wertes dieses Mitglieds vereinbart werden.
Sigset_t Sigmask Die Signalmaske für den untergeordneten Prozess, mit dem der Status von Flag -Mitgliedern angegeben wird.
SIGSET_T SIGDEFAULT Der Satz der untergeordneten Prozesse der Standardsignale.

Fehler

Der posix_spawn () Und pox_spawnp () Funktionen können in einigen Fällen auch scheitern, z. B. folgende:

Einval: Dies ist der Fall, wenn der von identifizierte Wert durch Datei_actions oder Attrp ist nicht korrekt und angemessen.

Wenn die zugrunde liegende Gabel (2), Gabel (2) oder der Klon (2) fehlschlägt, schlägt der fehl laichen() Funktionen geben eine Fehlernummer zurück.

Enosys: Dies ist der Fall, wenn die Funktion und ihre Unterstützung in einem System nicht enthalten oder bereitgestellt werden.

Abschluss

Dieses Tutorial umfasste die grundlegenden Funktionen, die von bereitgestellt wurden, Posix_spawn () und die von ihm verwendeten Funktionen zur Ausführung und Ausführung ihrer Funktionen. Wir haben auch die Flaggen und Fehler abgedeckt, die üblicherweise von Spawn verwendet werden.