forkを使った並列処理〜変数の値〜

前回は、forkを使った並列処理の概要を少し話しました。
今回は、親プロセスと子プロセスの変数の値についてまとめます。

変数の値

変数は全てコピーされます。
しかし、まったく別の空間なので子プロセスが親プロセスの変数にアクセスすることはできません。
これは、浅いコピーだから、値コピーだからという話ではありません
以下のようなプログラムを書いてみました

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

これを実行すると、以下のような出力が得られます。

                • -

my name is child process
&i is 0x5c7d2
i is 0
my name is mother process
&i is 0x5c7d2
i is 10

                  • -

アドレスの値が一緒なので、親プロセスの変数にアドレス経由ならアクセスできるかな?
って思った人もいるかもしれませんが。
あくまでも、別空間です!以下にイメージを示します
f:id:ukinau:20130930001046j:plain

ということで、変数はコピーされますがそれは親プロセスのモノとはまったく別物です。

では、どうやって親プロセスと子プロセスはデータをやりとりするのか?
詳しくは、次の記事で紹介しますがpipeやsocketを使います。