Heim >Backend-Entwicklung >C++ >Was ist in der C-Sprache der Unterschied zwischen fork() und exec()?

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

王林
王林nach vorne
2023-09-13 11:01:021496Durchsuche

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;
}

Ausgabe

The parent process is (8627)
The child process is (8756)
program is executed successfully

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:tutorialspoint.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen