Heim > Backend-Entwicklung > C++ > Hauptteil

Was ist in der C-Sprache der Unterschied zwischen fork() und exec()?

王林
Freigeben: 2023-09-13 11:01:02
nach vorne
1445 Leute haben es durchsucht

Was ist in der C-Sprache der Unterschied zwischen fork() und exec()?

Hier sehen wir die Wirkung der Systemaufrufe fork() und exec() in der Sprache C. fork wird verwendet, um einen neuen Prozess zu erstellen, indem der aufrufende Prozess kopiert wird. Der neue Prozess ist ein untergeordneter Prozess. Bitte beachten Sie die folgenden Eigenschaften.

  • Der untergeordnete Prozess hat seine eigene eindeutige Prozess-ID.
  • Die übergeordnete Prozess-ID des untergeordneten Prozesses ist dieselbe wie die Prozess-ID des aufrufenden Prozesses.
  • Der untergeordnete Prozess erbt nicht die Speichersperren und Semaphoren des übergeordneten Prozesses.

fork() gibt die PID des untergeordneten Prozesses zurück. Wenn der Wert ungleich Null ist, handelt es sich um die ID des übergeordneten Prozesses. Wenn der Wert 0 ist, handelt es sich um die ID des untergeordneten Prozesses.

Mit dem Systemaufruf exec() wird das aktuelle Prozessabbild durch ein neues Prozessabbild ersetzt. Es lädt das Programm in den aktuellen Bereich und führt es vom Einstiegspunkt aus aus.

Der Hauptunterschied zwischen fork() und exec() besteht also darin, dass fork() eine neue Kopie des Prozesses startet, die mit dem Hauptprozess identisch ist. exec() ersetzt das aktuelle Prozessabbild durch ein neues Prozessabbild und der übergeordnete Prozess und der untergeordnete Prozess werden gleichzeitig ausgeführt.

Beispiel

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
int main() {
   pid_t process_id;
   int return_val = 1;
   int state;
   process_id = fork();
   if (process_id == -1) { //when process id is negative, there is an error, unable to fork
      printf("can&#39;t fork, error occured</p><p>");
         exit(EXIT_FAILURE);
   } else if (process_id == 0) { //the child process is created
      printf("The child process is (%u)</p><p>",getpid());
         char * argv_list[] = {"ls","-lart","/home",NULL};
      execv("ls",argv_list); // the execv() only return if error occured.
      exit(0);
   } else { //for the parent process
      printf("The parent process is (%u)</p><p>",getppid());
      if (waitpid(process_id, &state, 0) > 0) { //wait untill the process change its state
         if (WIFEXITED(state) && !WEXITSTATUS(state))
            printf("program is executed successfully</p><p>");
         else if (WIFEXITED(state) && WEXITSTATUS(state)) {
            if (WEXITSTATUS(state) == 127) {
               printf("Execution failed</p><p>");
            } else
               printf("program terminated with non-zero status</p><p>");
         } else
            printf("program didn&#39;t terminate normally</p><p>");
      }
      else {
         printf("waitpid() function failed</p><p>");
      }
      exit(0);
   }
   return 0;
}
Nach dem Login kopieren

Ausgabe

The parent process is (8627)
The child process is (8756)
program is executed successfully
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWas ist in der C-Sprache der Unterschied zwischen fork() und exec()?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:tutorialspoint.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage