C-Programmierung

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 laufende Prozess in POSIX wird dann diese untergeordneten Prozesse und andere Prozesse asynchron entweder fortsetzen oder nicht weiter ausführen. Immer wenn ein neuer Unterprozess erstellt wird, benötigt er einen bestimmten Speicher, der die Ausführung des übergeordneten und untergeordneten Prozesses ermöglicht. In Microsoft Windows, UNIX und Linux gibt es eine bestimmte Familie von Spawns; und andere Familien von Spawn-Funktionen werden als optionale Erweiterung betrachtet.

Warum POSIX-Spawn verwenden??

Das posix_spawn() und posix_spawnp() Funktionen werden beide verwendet, um einen neuen untergeordneten Prozess 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 keine Unterstützung für Fork-Systemaufrufe haben. Diese Maschinen sind normalerweise klein und es fehlen die eingebetteten Systeme für die lMMU-Unterstützung.

Die beiden Funktionen kombinieren fork und exec mit einigen zusätzlichen Schritten, die das Kind ausführen execute. Sie fungieren als Teilmenge von Funktionalitäten, die normalerweise mit einem Fork erreicht werden, für alle Systemaufrufe und eingebetteten Systeme, denen diese Funktionalität fehlt lack.

Beispiel 1: posix_spawn()

In diesem Beispiel verwenden wir die spawn()-Funktion, um einen neuen untergeordneten Prozess zu erstellen und auszuführen. Dann erklären wir alle relevanten Argumente, die in der Funktion verwendet werden.

Die im Beispiel verwendeten Argumente lauten wie folgt:

Streit Beschreibung
Wird verwendet, um alle Spawn-Durchführungsoperationen zu definieren.
Pfad Der Name des auszuführenden Pfads.
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
Ein Array von Dateideskriptoren, die vom Kindprozess geerbt werden sollen. Wenn hier der Wert von fd_count nicht 0 ist, dann wird fd_map benötigt, um die fd_count-Dateideskriptoren auf den höchsten Wert von OPEN_MAX zu bringen. Es hat:

·      Die untergeordnete Prozesseingabe

· Die Ausgabe

·      Die Fehlerwerte

erben Die Strukturvererbung zeigt, dass Benutzer möchten, dass ihr Kindprozess alles vom Elternprozess erbt.
argv Der Zeiger auf einen bestimmten Argumentvektor. Der Wert argv[0] darf nicht NULL sein und muss der Dateiname sein, der geladen wird. Der argv-Wert darf nicht gleich NULL . sein.
envp Zeigt auf ein Array von Zeichenzeigern. Jeder der Zeiger in diesem Array zeigt auf eine Umgebungsvariable. Der Endpunkt des Arrays ist ein NULL-Zeiger.

Beispiel 2: testen.c

Im folgenden Beispiel wird ein neuer untergeordneter Prozess erstellt, um den Befehl auszuführen von /bin/sh -c. Dies ist der als erstes Argument übergebene Wert passed. Das Prüfung.c Code ist wie folgt:

Im obigen Beispiel haben wir die Bibliotheken aufgerufen und dann die laichen.ha Header. Sie sehen auch die posix_spawn() aufgerufen, um im obigen Beispiel einen untergeordneten Prozess zu erstellen. Das laichen und spawnp Funktionen werden anstelle der Gabel und ausführender Funktionen. Laichen() hat Flexibilität und bietet den Benutzern in vielerlei Hinsicht viel Komfort ease. Es ist ein bisschen anders als System() und exec(). Es wird zurückkehren und den neuen untergeordneten Prozess erstellen. In unserem Beispiel ist es pid. Oben sehen Sie, dass die Wartefunktion waitpid(), dann System() wird eingesetzt. Beachten Sie, dass die laichen() und Gabel() aufrufende Prozesse sind gleich, und die Art der Implementierung ist für beide Funktionen mehr oder weniger gleich.

Wir führen nun das Beispiel mit a . aus gcc Compiler. Sie können auch jeden anderen Compiler Ihrer Wahl verwenden:

$ sudo gcc-test.c -lrt

Führen Sie als Nächstes Folgendes aus:

$ ./ein.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 -l c, um die gcc Compiler. Beachten Sie hier, dass diese Bibliothek automatisch eingebunden wird.

Laichen()

Das laichen() Funktion basiert auf POSIX 1003.1d Normentwurf verwendet als posix_spawn(). Die C-Bibliothek enthält spawn*()-Funktionen. Hier werden wir einige Suffixe zusammen mit ihren Beschreibungen auflisten:

e: als Array für Umgebungsvariablen verwendet.

Ich: wird als NULL-terminierte Liste der im Programm verwendeten Argumente verwendet.

p: verwendet, um einen relativen Pfad zu definieren. Wenn der Wert des Pfads keinen Schrägstrich enthält, verwendet das System die Umgebungsvariable PATH und durchsucht sie nach ähnlichen Programmen.

v: fungiert als Vektor von Argumenten innerhalb des Programms.

Dateideskriptoren zuordnen

Im laichen(), wir üben die fd_count und fd_map Argumente zum Aufrufen der Dateideskriptoren. Es gibt an, welches Kind erben soll.

Die Nummer, die als Dateideskriptor für den untergeordneten Prozess verwendet wird, hängt von seiner Position im fd_map. Hier betrachten wir das Beispiel des übergeordneten Elements mit Dateideskriptoren mit den Werten 1, 3 und 5, dann sieht die Zuordnung ungefähr so ​​​​aus:

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

Beachten Sie, dass bei Verwendung der expliziten fd_map Um diese Dateideskriptoren dem Kind und dem Elternteil zuzuordnen, müssen Sie die SPWAN_FDCLOSE Funktion um fortzufahren.

Vererbungsflags

In Spawn müssen Benutzer im Falle einer Vererbung eines der folgenden Flags aufrufen. Einige Beispiele für Spawn-Flags und ihre Beschreibungen sind unten aufgeführt:

Flagge Beschreibung
SPAWN_ALIGN_DEFAULT Dieses Flag wird verwendet, um die Standardeinstellungen des Setups für die Ausrichtung festzulegen.
SPAWN_ALIGN_FAULT Dieses Flag wird für fehlerhafte Ausrichtung der Datenreferenzen verwendet used.
SPAWN_ALIGN_NOFAULT Dieses Flag wird verwendet, um den Fehlerversatz zu beheben.
SPAWN_DEBUG Dieses Flag wird verwendet, um den Kernel zu debuggen.
SPAWN_EXEC SPAWN verhält sich wie exec*() mit diesem Flag.
SPAWN_EXPLICIT_CPU Dieses Flag wird verwendet, um die Ausführungsmaske zu setzen und das mask=run mask-Mitglied zu erben.
SPAWN_EXPLICIT_SCHED Dieses Flag wird verwendet, um die Planungsrichtlinie festzulegen.

Das <laichen.ha> definiert diese Maske SPAWN_ALIGN_MASK verwendet, um die oben aufgeführten Flaggen auszurichten.

pid_t pgroup Die untergeordnete Prozessgruppe, wenn Sie die SPAWN_SETGROUP im Mitglied des Flags angeben.
int Runmask Die Runmask des untergeordneten Prozesses, um die Masken zu erben, die basierend auf dem Wert dieses Members vereinbart wurden.
sigset_t sigmask Die Signalmaske für den Kindprozess, die verwendet wird, um den Status von Flag-Mitgliedern anzugeben.
sigset_t sigdefault Die Menge der Kindprozesse der voreingestellten Signale.

Fehler

Das posix_spawn() und posix_spawnp() Funktionen können auch in einigen Fällen fehlschlagen, wie zum Beispiel in den folgenden:

EINVAL: Dies ist der Fall, wenn der mit gekennzeichnete Wert file_actions oder attrp ist nicht richtig und ausreichend.

Wenn der zugrunde liegende Aufruf von Fork (2), Fork (2) oder Clone (2) fehlschlägt, laichen() Funktionen geben eine Fehlernummer zurück.

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

Fazit

Dieses Tutorial behandelt die grundlegenden Funktionen von POSIX_spawn() und die Funktionen, die es verwendet, um seine Funktionen auszuführen und auszuführen. Wir haben auch die Flags und Fehler behandelt, die häufig von Spawn verwendet werden.

Kostenlose und Open-Source-Spiele-Engines für die Entwicklung von Linux-Spielen
Dieser Artikel behandelt eine Liste von kostenlosen und Open-Source-Spiele-Engines, die für die Entwicklung von 2D- und 3D-Spielen unter Linux verwend...
Shadow of the Tomb Raider für Linux Tutorial
Shadow of the Tomb Raider ist die zwölfte Erweiterung der Tomb Raider-Reihe – ein Action-Adventure-Franchise von Eidos Montrealdos. Das Spiel wurde vo...
So steigern Sie die FPS unter Linux?
FPS steht für Bilder pro Sekunde. Die Aufgabe von FPS besteht darin, die Bildrate bei Videowiedergaben oder Spielleistungen zu messen. In einfachen Wo...