2012-05-22 31 views
4

如果我使用write()將一些數據寫入磁盤上的文件,會發生什麼情況。但是我的應用程序在沖洗之前會崩潰。如果沒有系統故障,是否保證我的數據最終會刷新到磁盤?在linux中寫入後崩潰

+2

可能[重複](http://stackoverflow.com/questions/5132343/how-does-behave-linux-buffer-cache-when-an-application-is-crashing-down)。 –

+0

@ 111111如果您擔心事務完整性,則不能使用'std :: ofstream',因爲它沒有保證磁盤同步的選項。通常,您將使用'std :: ostringstream'來構造記錄(如果文件是面向文本的),然後使用'write()'在一個原子動作中輸出該記錄。 –

+0

@ 111111在你的進程崩潰的情況下,RAII不會爲你購買任何東西(當然,如果系統崩潰,甚至更少)。 –

回答

3

如果您使用的是write(而不是fwritestd::ostream::write), 則沒有進行中緩衝。如果沒有系統故障,那麼數據遲早(通常很快)會被寫入磁盤 。

如果您真的擔心數據完整性,則可以在標記 O_DSYNCO_SYNC中標記打開文件時的標記。如果你這樣做 ,你保證數據在從write返回之前物理寫入磁盤 。

+1

[kernel.org docs](http://kernel.org/doc/man-pages/online/pages/man2/write.2.html)這樣說:「write()的成功返回不作任何保證該數據有 已被提交到磁盤。實際上,在一些錯誤的實現,它不是 甚至保證已成功爲數據保留空間。 唯一可以肯定的方法是在您之後調用fsync(2)完成了你所有的 數據。「 –

+0

@DavidHeffernan:如果'write'返回,內核擁有你的數據,如果它碰到拼盤則是另一回事。 (由於磁盤有自己的緩存,所以'fsync'可能也無濟於事)。這裏的關鍵是'承諾到磁盤'這不能保證 – Hasturkun

+1

@DavidHeffernan很明顯,如果實現是越野車,那麼你不能保證任何東西。 'write()'返回的結果保證操作系統擁有數據,並且無論處理過程如何,都將「完成」處理。如果您使用我在'open'中提到的標誌,那麼根據Posix的說法,系統不應該從'write()'返回,直到完全保證數據完整性。 (實際上,這在某些文件系統上可能是不可能的,特別是遠程安裝的文件系統。) –