forkを使った並列処理〜概要〜

forkを使って並列処理をやってみようって話題が研究室内で出たので、ちょっと勉強してみた。
rubyとかjavaでスレッドは使ったことあったけど、プロセスの複製を行う並列処理は初めてなのでいろいろ勉強になってる。

ちょっとまとめてみた。

概要

forkは、新しいプロセスを生成するシステムコールです。
もう少し正確にいうと、呼び出し元のプロセスを複製して子プロセスを生成します。

まぁ、これだけなんですがちょっとこれでは、分かりづらいので実際にプログラムを書いてみます。


#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
 
int main(){
 
  int pid;
 
  if((pid = fork())<0){
    perror("call fork()");
    exit(1)
  }
  //this is child process
  if(pid == 0){
    printf(" my name is child process ¥n pid variable is %d ¥n pid is %d ¥n mother process is %d",pid,getpid(),getppid());
  }//this is mother process
  else{
    printf(" my name is mother process ¥n , pid variable is  %d ¥n pid is %d",pid,getpid());
  }
 
}

上記プログラムを実行すると以下のような出力が得られます。

                                • -

my name is child process
pid variable is 0
pid is 574 #=> 実行する度に変わります
mother process is 698 #=> 実行する度に変わります

my name is mother process
pid variable is 574
pid is 698

                                • -


fork()を実行するとプログラムは2つに分かれます。イメージは以下の通り

f:id:ukinau:20130929125622j:plain

実はこれが結構分かりづらい。
親プロセスの方のpidには、子プロセスのプロセスIDが入り、子プロセスの方には必ず0が入ります。
上記のサンプルを見てもらっても分かるんですが、pid周りは、以下のような感じになります

f:id:ukinau:20130929125732p:plain


pid(forkの返り値)は自分のホスト内で一意の値が割り当てられるという表記をよく見るのですが、
これは、親側から見た話です。

子供からみたpid(forkの返り値)は常に0です。