ここでは、C 言語の fork() および exec() システム コールの効果を見ていきます。 fork は、呼び出し元のプロセスをコピーして新しいプロセスを作成するために使用されます。新しいプロセスは子プロセスです。以下のプロパティを参照してください。
fork() は子プロセスの PID を返します。値がゼロ以外の場合は親プロセスの ID であり、値が 0 の場合は子プロセスの ID です。
exec() システム コールは、現在のプロセス イメージを新しいプロセス イメージに置き換えるために使用されます。プログラムを現在のスペースにロードし、エントリ ポイントから実行します。
つまり、fork() と exec() の主な違いは、fork() がメイン プロセスと同一の新しいプロセス コピーを開始することです。 exec()は現在のプロセスイメージを新しいプロセスイメージに置き換え、親プロセスと子プロセスが同時に実行されます。
#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
以上がC言語では、fork()とexec()の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。