ためになるホームページ お問い合わせ




TOP > C言語 > プロセスの生成
プロセスの生成
Cのプログラム中から、新しくプロセスを生成するには、fork()関数を用いる
以下は、簡単な手順である。
1.forkで子プロセスを生成
2.execで、子プロセスを実行
3.親プロセスは、waitpid関数で子プロセスを待ち、残りの処理を実行

fork関数
fork関数を呼び出すと、カーネルはそのプロセスを複製し、2つのプロセスに分裂する。
子プロセスは、forkの戻り値は0なので、処理を親プロセスと子プロセスで、分岐させる。
宣言:void fork(void)

exec関数
exec関数は、自プロセスを新しいプログラムで上書きする関数。
呼び出した時点で、現在のプログラムに上書きする。
ここでは、exec関数は、何種類もあるので詳細は述べません。

waitpid関数
waitpid関数は、指定したプロセスが終了するのを待つ。
宣言:pid_t waitpid(pid_t pid, int *status, int options);

プロセスの生成
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main(int argc, char** argv)
{
  pid_t pid;
  int status;
  
  /// 新しいプロセスを作る
  /// カーネルは、同じプロセスをもう1つ作る
  pid = fork();

  /// プロセス作成に失敗した時は、0未満を返す
  if ( pid < 0 )
  {
    fprintf (stderr, "fork error\n");
    exit(1);
  }

  /// 子プロセスのpidは、0
  if (pid == 0) 
  {
    execl("/bin/echo", "echo", "hahaha", NULL);
    perror("/bin/cat");
    exit(-1);
  }
  else
  {
    /// 子プロセスの終るのを待つ
    waitpid(pid, &status, 0);
    printf ("child(PID=%d) finished!\n", pid);

    
    if (WIFEXITED(status)){
      /// 子プロセスがexit以外で終了した場合は0を返す
      /// exitで終了した時は、0以外を返す
      printf("exit, status=%d\n", WEXITSTATUS(status));
    } else if (WIFSIGNALED(status)){
      /// シグナルで終了していた時は0以外を返し、
      /// それ以外は、0を返す
      printf("signal, sig=%d\n", WTERMSIG(status));
    } else {
      printf("abnormal exit\n");
    }
    exit(0);
  }
  return(0);
}








Copyright 2007 ためになるホームページ All Rights Reserved.