アプリ版:「スタンプのみでお礼する」機能のリリースについて

#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ではないでしょうか?

わかりにくい説明ですいません。
よろしくお願いします。

A 回答 (2件)

あ~, 読み返してみたら用語が混乱してる (ついでに fork をミススペルしてる).... すみません, 言い直します.


基本的に, 全てのプロセスは「そのプロセス専用のデータ領域」を持ちます. そして, fork というシステムコールは「プログラムコードを共有する新たなプロセス」を作るのですが, そのときに, 親プロセスの持っている全てのデータを新たなプロセス用のデータ領域にコピーしてします. だから, fork から返った時点で「プログラムコードは共有するけどデータは個別」の 2個のプロセスになっています.
そして, fork は「親プロセス」には子プロセスの PID を, 「子プロセス」には 0 を返します. その返り値を「各プロセスが個別に持っている」変数 i に代入しているので, 親プロセスと子プロセスで違う値となっています.
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/11/22 00:53

fork をしたら, 論理的には別のプログラムだと思ってください.


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

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

お礼日時:2008/05/23 09:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!