Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

Cでのfork()とexec()の違い


ここでは、Cでのfork()およびexec()システムコールの効果を確認します。フォークは、呼び出しプロセスを複製することにより、新しいプロセスを作成するために使用されます。新しいプロセスは子プロセスです。次のプロパティを参照してください。

  • 子プロセスには独自のプロセス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't fork, error occured\n");
         exit(EXIT_FAILURE);
   } else if (process_id == 0) { //the child process is created
      printf("The child process is (%u)\n",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)\n",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\n");
         else if (WIFEXITED(state) && WEXITSTATUS(state)) {
            if (WEXITSTATUS(state) == 127) {
               printf("Execution failed\n");
            } else
               printf("program terminated with non-zero status\n");
         } else
            printf("program didn't terminate normally\n");
      }
      else {
         printf("waitpid() function failed\n");
      }
      exit(0);
   }
   return 0;
}

出力

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

  1. CSS表示と可視性の違い

    CSSVisibilityプロパティとCSSDisplayプロパティをそれぞれ使用して、HTMLドキュメント内の要素を非表示または削除できます。ユーザーには、2つのプロパティのいずれを使用しても違いはないように見えるかもしれませんが、違いはあります。 CSSディスプレイ − noneはドキュメント上の要素をレンダリングしないため、スペースを割り当てません。 CSSの可視性 − hiddenはドキュメント上の要素をレンダリングし、スペースも割り当てられますが、ユーザーには表示されません。 例 CSS表示の例を見てみましょうなし- <!DOCTYPE html> <html

  2. Bashでの$$と$BASHPIDの違いを学ぶ

    最近、シェルスクリプトに取り組んでいて、bashの特殊変数$に大きな違いが見られました。 およびBASHPID 動作します。 Linuxで実行されているすべてのプロセスには、プロセス IDが割り当てられます。 これが、オペレーティングシステムがプロセスを処理する方法です。 関連記事 :Bashでのソーシングとフォークの違いを学ぶ 同様に、bashターミナルセッションにもプロセスIDが割り当てられます。 $という特別な変数があります および$BASHPID 現在のシェルのプロセスIDを格納します。 先に進み、以下のコマンドを実行して、現在のシェルのプロセスIDを確認します。両方の$ および$