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.

Fügen Sie mit diesen kostenlosen Tools Mausgesten zu Windows 10 hinzu
In den letzten Jahren haben sich Computer und Betriebssysteme stark weiterentwickelt. Es gab eine Zeit, in der Benutzer Befehle verwenden mussten, um ...
Steuern und verwalten Sie Mausbewegungen zwischen mehreren Monitoren in Windows 10
Dual-Display-Maus-Manager lässt Sie die Mausbewegung zwischen mehreren Monitoren steuern und konfigurieren, indem Sie ihre Bewegungen in der Nähe der ...
Mit WinMouse können Sie die Mauszeigerbewegung auf einem Windows-PC anpassen und verbessern improve
Wenn Sie die Standardfunktionen Ihres Mauszeigers verbessern möchten, verwenden Sie Freeware WinMouse. Es fügt weitere Funktionen hinzu, damit Sie das...