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.
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.
#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'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't terminate normally</p><p>"); } else { printf("waitpid() function failed</p><p>"); } exit(0); } return 0; }
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!