プロが教えるわが家の防犯対策術!

ファイルをオープンしたままforkした際の動作について質問です。

下のコードを書いてコンパイル、実行します。

#include <stdio.h>

int main(int argc, char **argv){
FILE *fp;
fp=fopen("file", "w");

fprintf(fp, "%d\n", getpid());
printf("%d\n", getpid());

fork();
}
======
$ gcc hoge.c -o hoge.out
$ ./hoge.out
XXX ←pid

なぜかファイル内には同じpidが2つ書かれている。
$ cat file
XXX
XXX

fork()によって生成されたプロセスが元のプロセスのファイルを参照することは予想できます。
しかしforkする前にfprintしているのになぜまたファイルに同じ内容が書き込まれるのでしょうか?

A 回答 (3件)

ライブラリがバッファリングしてるんですよ(・3・)


あなたの現在の環境では標準出力は行バッファリングになっています。
しかしfileへの出力は行バッファリングになっていません。
そのためバッファに残ったままです。
fork()後に何も処理しないように見えますが、
実はmainが最初の関数じゃないんですよ。
mainが終わってライブラリの終了処理関数に入るんです。
そこでバッファの中が吐かれるため親プロセス、子プロセス
2つ分がfileに出力されるという訳ですね。
    • good
    • 0
この回答へのお礼

なるほど。。

原因が分かりました。
ご解答ありがとうございます。

お礼日時:2009/01/11 10:49

forkする前にflushすると良いのでは。

    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。

ご指摘のように、forkするまえにflushさせたところうまくいきました。

fflush(fp);
fork();

お礼日時:2009/01/11 10:51

>しかしforkする前にfprintしているのになぜまた


>ファイルに同じ内容が書き込まれるのでしょうか?

「実際にファイルに書き込まれた」のが fork した後になっているというだけなのでは?

この回答への補足

fprintfした後にforkしています。
処理の流れとして、forkしてできたプロセスはそれ以後の処理をするだけかと思っているのですが間違いでしょうか??

実際に標準出力には1ラインしか出てこないですし。

補足日時:2009/01/11 03:34
    • good
    • 0

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