C言語では、fork()とexec()の違いは何ですか?

王林
リリース: 2023-09-13 11:01:02
転載
1445 人が閲覧しました

C言語では、fork()とexec()の違いは何ですか?

ここでは、C 言語の fork() および exec() システム コールの効果を見ていきます。 fork は、呼び出し元のプロセスをコピーして新しいプロセスを作成するために使用されます。新しいプロセスは子プロセスです。以下のプロパティを参照してください。

  • 子プロセスには独自の一意のプロセス ID があります。
  • 子プロセスの親プロセス ID は、呼び出し元プロセスのプロセス ID と同じです。
  • 子プロセスは、親プロセスのメモリ ロックとセマフォを継承しません。

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&#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;
}
ログイン後にコピー

出力

The parent process is (8627)
The child process is (8756)
program is executed successfully
ログイン後にコピー

以上がC言語では、fork()とexec()の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:tutorialspoint.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート