• 締切済み

プロセスの生成

#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ではないでしょうか? わかりにくい説明ですいません。 よろしくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

あ~, 読み返してみたら用語が混乱してる (ついでに fork をミススペルしてる).... すみません, 言い直します. 基本的に, 全てのプロセスは「そのプロセス専用のデータ領域」を持ちます. そして, fork というシステムコールは「プログラムコードを共有する新たなプロセス」を作るのですが, そのときに, 親プロセスの持っている全てのデータを新たなプロセス用のデータ領域にコピーしてします. だから, fork から返った時点で「プログラムコードは共有するけどデータは個別」の 2個のプロセスになっています. そして, fork は「親プロセス」には子プロセスの PID を, 「子プロセス」には 0 を返します. その返り値を「各プロセスが個別に持っている」変数 i に代入しているので, 親プロセスと子プロセスで違う値となっています.

push-pop
質問者

お礼

遅くなってすいません。 ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

fork をしたら, 論理的には別のプログラムだと思ってください. 別のプログラムだったら, 同じ変数に違う値が入っていても問題ないですよね. で後者の方ですが, 親プロセス (folk したプロセス) が子プロセス (folk でできたプロセス) より先に終了するとそのようなことになります. Unix では, 親に先に死なれたみなしごプロセスは init (というプロセス) にひきとられます. init の PID は 1 ですから, そういう結果になっているんじゃないでしょうか.

push-pop
質問者

お礼

ありがとうございます。 親プロセスが1になる理由はわかったのですが、論理的には別のプログラムという考え方が、うまく理解できませんでした。 もしよろしければ、さらにアドバイスをお願いします。

関連するQ&A