ファイルをオープンしたまま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しているのになぜまたファイルに同じ内容が書き込まれるのでしょうか?
No.2ベストアンサー
- 回答日時:
ライブラリがバッファリングしてるんですよ(・3・)
あなたの現在の環境では標準出力は行バッファリングになっています。
しかしfileへの出力は行バッファリングになっていません。
そのためバッファに残ったままです。
fork()後に何も処理しないように見えますが、
実はmainが最初の関数じゃないんですよ。
mainが終わってライブラリの終了処理関数に入るんです。
そこでバッファの中が吐かれるため親プロセス、子プロセス
2つ分がfileに出力されるという訳ですね。
No.3
- 回答日時:
forkする前にflushすると良いのでは。
ご解答ありがとうございます。
ご指摘のように、forkするまえにflushさせたところうまくいきました。
fflush(fp);
fork();
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSでEXCEL⇒CSV変換で日付の書...
-
Accessでのレポート印刷待機方法
-
CSV形式に変換
-
VBA でメモ帳へ保存する際の保...
-
ファイル出力の場所を指定
-
出力をExcelにすることは可能??
-
MS-Word で作成した表をLatexに...
-
VBAでエクセルをCSVに変換時
-
gnuplotでreplotできない??
-
Acccess レポートをグループ別...
-
二次元配列をクリップボードに...
-
C言語でBMP画像(ファイル)は...
-
シェルコマンドの 2>&1 とはど...
-
FORTRANの出力データの左寄せが...
-
printfだと出力されるのにfprin...
-
PDFファイルを指定の名前でプロ...
-
OCRで起こしたテキスト文字をCS...
-
コンソールの出力をパイプでダ...
-
ドキュワークスでPDFファイルを...
-
井戸型ポテンシャルの数値解シ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド(例えばls)の出力結果...
-
ファイル出力の場所を指定
-
VC++でUTF-8のファイルを出力し...
-
テキストファイルに改行コード...
-
シェルコマンドの 2>&1 とはど...
-
Acccess レポートをグループ別...
-
Wordマクロで指定したフォルダ...
-
二次元配列をクリップボードに...
-
ファイル形式またはファイル拡...
-
CreateProcess関数と実行後の戻...
-
fortranのtxtファイル出力書式...
-
サウンド出力のデバイスを選択...
-
VBA でメモ帳へ保存する際の保...
-
1行ずつではなくまとめてファイ...
-
VBSでEXCEL⇒CSV変換で日付の書...
-
C++ fprintf_sの使い方がわからん
-
ファイルの文字コードをUTF-8に...
-
pLaTeX の EPSファイル読み込み...
-
AccessVBA複数レポート条件毎に...
-
フォルダにあるPDF情報の抽出(VBA)
おすすめ情報