2011-12-07 16 views
4

これに関連する質問のカップル(here)を読んだことがありますが、まだ混乱があります。書き込みシステムコールはデータを直接ディスクに書き込みますか?

私の理解では、書き込みシステムコールはデータをBuffered Cache(その質問で言及されているようにOSキャッシュ)に入れています。 Buffered Cacheがいっぱいになると、ディスクに書き込まれます。

バッファードIOは、この上でさらに最適化されています。それはC RTL buffersにキャッシュされ、満杯になったらwriteシステムコールが発行され、内容をBuffered Cacheに移動します。 fflushを使用すると、C RTL buffersに存在する特定のファイルに関連するデータとBuffered Cacheのデータがディスクに送信されます。

私の理解は正しいですか?

+0

ファイルオープンモード、システム固有のファイルハンドル設定... – Mat

答えて

3

stdioバッファのフラッシュ方法は、使用する標準のCライブラリに依存します。 Linux manual pageから

fflush()は、Cライブラリによって提供されるユーザースペースバッファのみをフラッシュすることに注意してください。 データが物理的にディスクに格納されるようにするには、sync(2)やfsync(2)などでカーネルバッファを にフラッシュする必要があります。

これは、Linuxシステム上で、fflushを使用するか、バッファをオーバーフローするwrite関数を呼び出すことを意味します。しかし、オペレーティングシステムは内部バッファを保持し、実際にデバイスにデータを書き込むことはできません。データが本当にデバイスに書き込まれるようにするには、fflushとローレベルのfsyncの両方を使用します。

編集:回答を再入力してください。

+0

@JP:printfが最終的にシステムコールを書き込むという意味でそれらを混在させました。 – FourOfAKind

+0

@Lamia:私は私の言葉を改めました回答。 –