プロセスの生成
#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ではないでしょうか?
わかりにくい説明ですいません。
よろしくお願いします。
お礼
なんと、うまくいきました。ありがとうございます。 前にこれでやったときは別のコマンドプロンプトウィンドウが開いたんで、他の方法を探していたんですが、その時はどうも何かが間違っていたようです。 あんまり嬉しいのでもう一度お礼を言っておきます。ありがとうございました。