C-Programmierung

Fork-Systemaufruf in C

Fork-Systemaufruf in C
Der Systemaufruf fork() wird verwendet, um untergeordnete Prozesse in einem C-Programm zu erstellen. fork() wird verwendet, wenn eine parallele Verarbeitung in Ihrer Anwendung erforderlich ist. Die Systemfunktion fork() ist in den Headern definiert sys/typen.ha und unistd.ha. In einem Programm, in dem Sie fork verwenden, müssen Sie auch den Systemaufruf wait() verwenden. Der Systemaufruf wait() wird verwendet, um im übergeordneten Prozess zu warten, bis der untergeordnete Prozess beendet ist. Um einen Kindprozess zu beenden, wird der Systemaufruf exit() im Kindprozess verwendet. Die Funktion wait() ist im Header definiert defined sys/warte.ha und die Funktion exit() ist im Header definiert defined stdlib.ha.

Abb. 1: Grundlegender fork()-Workflow

In diesem Artikel zeige ich Ihnen, wie Sie den Systemaufruf fork() verwenden, um untergeordnete Prozesse in C zu erstellen. Also lasst uns anfangen.

fork() Syntax und Rückgabewert:

Die Syntax der Systemfunktion fork() lautet wie folgt:

pid_t fork(leer);

Die Systemfunktion fork() akzeptiert keine Argumente. Es gibt eine ganze Zahl vom Typ . zurück pid_t.

Bei Erfolg gibt fork() die PID des Kindprozesses zurück, die größer als 0 ist. Innerhalb des Kindprozesses ist der Rückgabewert 0. Wenn fork() fehlschlägt, gibt es -1 . zurück.

Einfache fork() Beispiel:

Ein einfaches fork()-Beispiel ist unten angegeben:

#einschließen
#einschließen
#einschließen
#einschließen
#einschließen
 
int main(void)
pid_t pid = fork();
 
if(pid == 0)
printf("Kind => PPID: %d PID: %d\n", getppid(), getpid());
Beenden (EXIT_SUCCESS);

sonst if(pid > 0)
printf("Eltern => PID: %d\n", getpid());
printf("Warten, bis der untergeordnete Prozess abgeschlossen ist.\n");
warten (NULL);
printf("Kinderprozess beendet.\n");

sonst
printf("Kind-Prozess kann nicht erstellt werden.\n");

 
EXIT_SUCCESS zurückgeben;

Hier habe ich fork() verwendet, um einen untergeordneten Prozess aus dem Haupt- / Elternprozess zu erstellen. Dann habe ich die PID (Prozess-ID) und PPID (Parent-Prozess-ID) von Kind- und Elternprozess gedruckt. Auf dem übergeordneten Prozess wird wait(NULL) verwendet, um zu warten, bis der untergeordnete Prozess abgeschlossen ist. Beim Kindprozess wird exit() verwendet, um den Kindprozess zu beenden. Wie Sie sehen, ist die PID des übergeordneten Prozesses die PPID des untergeordneten Prozesses. Also, der Kindprozess 24738 gehört zum übergeordneten Prozess 24731.

Sie können auch Funktionen verwenden, um Ihr Programm modularer zu gestalten. Hier habe ich verwendet processTask() und parentTask() Funktionen für die Child- bzw. Parent-Prozesse. So wird fork() tatsächlich verwendet.

#einschließen
#einschließen
#einschließen
#einschließen
#einschließen
 
void childTask()
printf("Hallo Welt\n");

 
void parentTask()
printf("Hauptaufgabe.\n");

 
int main(void)
pid_t pid = fork();
 
if(pid == 0)
childTask();
Beenden (EXIT_SUCCESS);

sonst if(pid > 0)
warten (NULL);
parentTask();

sonst
printf("Kind-Prozess kann nicht erstellt werden.");

 
EXIT_SUCCESS zurückgeben;

Die Ausgabe des obigen Programms:

Ausführen mehrerer untergeordneter Prozesse mit fork() und Loop:

Sie können auch Schleife verwenden, um so viele untergeordnete Prozesse zu erstellen, wie Sie benötigen. Im folgenden Beispiel habe ich 5 untergeordnete Prozesse mit der for-Schleife erstellt. Ich habe auch die PID und PPID aus den untergeordneten Prozessen gedruckt.

#einschließen
#einschließen
#einschließen
#einschließen
#einschließen
 
int main(void)
for(int i = 1; i <= 5; i++)
pid_t pid = fork();
 
if(pid == 0)
printf("Untergeordneter Prozess => PPID=%d, PID=%d\n", getppid(), getpid());
Ausgang (0);

sonst 
printf("Elternprozess => PID=%d\n", getpid());
printf("Warten, bis untergeordnete Prozesse fertig sind… \n");
warten (NULL);
printf("Kindprozess beendet.\n");


 
EXIT_SUCCESS zurückgeben;

Wie Sie sehen, ist die ID des übergeordneten Prozesses in allen untergeordneten Prozessen gleich. Sie gehören also alle demselben Elternteil. Sie werden auch linear ausgeführt. Einer nach dem anderen. Untergeordnete Prozesse zu steuern ist eine anspruchsvolle Aufgabe. Wenn Sie mehr über die Linux-Systemprogrammierung und ihre Funktionsweise erfahren, können Sie den Ablauf dieser Prozesse nach Belieben steuern control.

Beispiel aus dem echten Leben:

Verschiedene komplexe mathematische Berechnungen wie md5, sha256 usw. Hash-Generierung erfordern viel Rechenleistung. Anstatt solche Dinge im selben Prozess wie das Hauptprogramm zu berechnen, können Sie einfach den Hash auf einem Kindprozess berechnen und den Hash an den Hauptprozess zurückgeben.

Im folgenden Beispiel habe ich in einem untergeordneten Prozess einen 4-stelligen PIN-Code generiert und an den übergeordneten Prozess, das Hauptprogramm, gesendet. Dann habe ich den PIN-Code von dort aus gedruckt.

#einschließen
#einschließen
#einschließen
#einschließen
#einschließen
 
int getPIN()
// PPID und PID als Seed verwenden
srand(getpid() + getppid());
int geheim = 1000 + rand() % 9000;
Geheimnis zurückgeben;

 
int main(void)
int fd[2];
Rohr (fd);
pid_t pid = fork();
 
if(pid > 0)
schließen(0);
schließen(fd[1]);
dup(fd[0]);
 
int geheimeNummer;
size_t readBytes = read(fd[0], &secretNumber, sizeof(secretNumber));
 
printf("Warten auf PIN…\n");
warten (NULL);
printf("Gelesene Bytes: %ld\n", readBytes);
printf("PIN: %d\n", geheimeNummer);

sonst if(pid == 0)
schließen(1);
schließen(fd[0]);
dup(fd[1]);
 
int geheim = getPIN();
write(fd[1], &secret, sizeof(secret));
Beenden (EXIT_SUCCESS);

 
EXIT_SUCCESS zurückgeben;

Wie Sie sehen, erhalte ich jedes Mal, wenn ich das Programm ausführe, einen anderen 4-stelligen PIN-Code.

So verwenden Sie im Wesentlichen den Systemaufruf fork() in Linux. Danke, dass du diesen Artikel gelesen hast.

Installieren Sie das neueste OpenRA-Strategiespiel auf Ubuntu Linux
OpenRA ist eine Libre/Free Real Time Strategy Game Engine, die die frühen Westwood-Spiele wie den Klassiker Command & Conquer: Red Alert Red nachbilde...
Installieren Sie den neuesten Dolphin Emulator für Gamecube & Wii unter Linux
Mit dem Dolphin Emulator können Sie Ihre ausgewählten Gamecube- und Wii-Spiele auf Linux-Personalcomputern (PC) spielen. Als frei verfügbarer Open-So...
So verwenden Sie die GameConqueror-Cheat-Engine unter Linux
Der Artikel enthält eine Anleitung zur Verwendung der GameConqueror-Cheat-Engine unter Linux. Viele Benutzer, die Spiele unter Windows spielen, verwen...