プロセスの生成
#include<stdio.h>
#include <unistd.h>
main(){
int i;
printf("\t(%s)プロセスID.....%d\n","元",getpid());
printf("\t(%s)親プロセスID...%d\n","元",getppid());
if((i=fork())==0)
{ //子プロセスで実行する部分
printf("\t子プロセスでのfork()の値 : %d\n",i);
printf("\t(%s)プロセスID.............%d\n","子",getpid());
printf("\t(%s)親プロセスID...........%d\n","子",getppid());
printf("子プロセスを終了します\n");
}
else{//親プロセスで実行する部分
printf("\t親プロセスでのfork()の値 : %d\n",i);
printf("\t(%s)プロセスID.............%d\n","親",getpid());
printf("\t(%s)親プロセスID...........%d\n","親",getppid());
printf("親プロセスを終了します\n");
}
}
fork関数の振る舞いについてです。
上記のプログラムをgccでコンパイルして実行した場合出力結果が
/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
(元)プロセスID.....375
(元)親プロセスID...246
親プロセスでのfork()の値 : 376
子プロセスでのfork()の値 : 0
(子)プロセスID.............376
(子)親プロセスID...........375
子プロセスを終了します
(親)プロセスID.............375
(親)親プロセスID...........246
親プロセスを終了します
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
という感じで出力されました。
fork関数がプロセスの複製を行っていることと、戻り値が0と376の2つであることはわかりました。
また子プロセスには0を親プロセスには376を返すこともわかりました。
感覚的にはif文の真である子プロセス側の記述文と偽である親プロセス側
の記述文が同時に実行されているのではないかと考えましたが
同時に実行されているのに
printf("\t子プロセスでのfork()の値 : %d\n",i);
printf("\t親プロセスでのfork()の値 : %d\n",i);
で表示される値が違うのはなぜでしょうか。
i=fork()によって代入されているのはわかるのですが、
同時に実行されつつ何故2つの違う値をiは出力できるのかがわかりません。
また出力結果が
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
(元)プロセスID.....377
(元)親プロセスID...246
親プロセスでのfork()の値 : 378
(親)プロセスID.............377
(親)親プロセスID...........246
親プロセスを終了します
子プロセスでのfork()の値 : 0
(子)プロセスID.............378
(子)親プロセスID...........1
子プロセスを終了します
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
子プロセスから見たときの親プロセスが1となっているのは何故でしょうか?
本来ならば377ではないでしょうか?
わかりにくい説明ですいません。
よろしくお願いします。
お礼
ありがとうございます。 oracleのdevサイトですね。覗いてみます。