1

私はCで小さなプログラムを書きました

FILE *fp = fopen("/tmp/file", "w+");
char *buf = "hello";
fwrite(buf, 1, strlen(buf), fp);
for(;;);

catを使用してコンテンツを読み取るシェルでは、fflushが呼び出されていないため、ファイルは空です。私の質問は、それが永遠にこのように残るのか、それともいつかデータがディスクにプッシュされるのかということです。

言い換えると、fwrite呼び出しはファイルシステムの境界を越えてVMサブシステムに到達しますか?はいの場合、ページデーモンをいつか呼び出す必要があります。これによりコンテンツがファイルにフラッシュされます。そうでない場合、ファイルが閉じられるかフラッシュされるまで、データは永久にそこに残ります。

4

3 に答える 3

4

stdio FILEには内部バッファーがあります(詳細については、setvbufを参照してください)。fwriteorまたはfprintfor呼び出しは、そのfputsバッファーをいっぱいにしています。いっぱいになったとき、またはを呼び出したときにのみ、ファイルシステムに書き込まれます(write(2)fflush syscallを使用して、カーネル内で実行されます) 。

行バッファリング(stdoutなど)writeがある場合は、バッファに改行が表示されたときにトリガーされます

PSはstrace、プログラムが何をしているのかを理解しようとします。

PPS Linuxは自由ソフトウェアです。GNUlibcまたはmusl-libcソースコードを調べることができます。これらのソースは、私が読みやすいと思います。

于 2013-01-04T20:48:34.450 に答える
3

fwriteは、writeシステムコールに加えてバッファリングを追加します。このバッファリングはクライアント側ライブラリ(libc)で行われるため、libcで実行されている非同期スレッドがないため、それ自体でフラッシュを実行するため、永久に待つことができます。

于 2013-01-04T20:46:55.457 に答える
3

FILE *バッファリングはlibcに実装されているため、答えはノーです。カーネルはデータを認識しませんでしたが、認識しませんでした。

于 2013-01-04T20:47:27.780 に答える