C言語入門講座。関数、サンプル集を参考にして、 C言語をマスターしよう。初心者から上級者まで。

子プロセスを生成する

2012.08.11

fork関数は、呼び出し元プロセスを複製して、子プロセス(新しいプロセス)を生成します。fork関数を呼び出した(実行した)プロセスを親プロセス、新しく生成したプロセスを子プロセスと呼んでいます。子プロセスにはユニークなプロセスIDが付与されます。

子プロセスが親プロセスより先に終了すると、子プロセスは「ゾンビ」状態で残り続けます。これを避けるには、親プロセスはwait関数を呼び出して子プロセスが終了したら、システムがその子プロセスに関連するリソースを解放できるようにします。

この関数は、C言語のライブラリ関数(標準関数)ではありませんので、コンパイラにより、使えない場合があります。

#include <unistd.h>
pid_t fork(void);

引数はありません。

戻り値として、処理が成功した場合は、親プロセスには子プロセスのプロセスIDが、子プロセスには0を返します。失敗した場合は親プロセスに-1を返します。

子プロセスはfork関数実行時点の親プロセスの複製(コピー)ですので、オープン済みのファイルや変数は子プロセスにそのまま引き継ぎます。そのため、それらは子プロセスで引き続き使うことが出来ます。一方、変数の値により、自プロセスが親プロセスか子プロセスかの判断はできません。判断したい場合は、fork関数の戻り値が0の方が子プロセスで、0以外が親プロセスです。

子プロセスの内容を入れ替えて、まったく別の機能のプログラムとして実行したい場合は、execve関数により、外部プログラムを取り込むようにするとよいでしょう。

プログラム 例

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
  int         p_id;
  int         status;
  int         return_code = 0;

  if ((p_id = fork()) == 0) {
    /* 子プロセス */
    printf("子プロセス開始\n");

    sleep(2);

    printf("子プロセス終了\n");
  }
  else {
    /* 親プロセス */
    if (p_id != -1) {
      wait(&status);
      printf("親プロセス終了\n");
    }
    else {
      perror("親プロセス : ");
      return_code = 1;
    }
  }

  return return_code;
}

 

例の実行結果

$ ./fork.exe
子プロセス開始
子プロセス終了
親プロセス終了
$

関連記事