如果我使用write()將一些數據寫入磁盤上的文件,會發生什麼情況。但是我的應用程序在沖洗之前會崩潰。如果沒有系統故障,是否保證我的數據最終會刷新到磁盤?在linux中寫入後崩潰
回答
如果您使用的是write
(而不是fwrite
或std::ostream::write
), 則沒有進行中緩衝。如果沒有系統故障,那麼數據遲早(通常很快)會被寫入磁盤 。
如果您真的擔心數據完整性,則可以在標記 O_DSYNC
和O_SYNC
中標記打開文件時的標記。如果你這樣做 ,你保證數據在從write
返回之前物理寫入磁盤 。
[kernel.org docs](http://kernel.org/doc/man-pages/online/pages/man2/write.2.html)這樣說:「write()的成功返回不作任何保證該數據有 已被提交到磁盤。實際上,在一些錯誤的實現,它不是 甚至保證已成功爲數據保留空間。 唯一可以肯定的方法是在您之後調用fsync(2)完成了你所有的 數據。「 –
@DavidHeffernan:如果'write'返回,內核擁有你的數據,如果它碰到拼盤則是另一回事。 (由於磁盤有自己的緩存,所以'fsync'可能也無濟於事)。這裏的關鍵是'承諾到磁盤'這不能保證 – Hasturkun
@DavidHeffernan很明顯,如果實現是越野車,那麼你不能保證任何東西。 'write()'返回的結果保證操作系統擁有數據,並且無論處理過程如何,都將「完成」處理。如果您使用我在'open'中提到的標誌,那麼根據Posix的說法,系統不應該從'write()'返回,直到完全保證數據完整性。 (實際上,這在某些文件系統上可能是不可能的,特別是遠程安裝的文件系統。) –
- 1. Bdb崩潰併發寫入,C++ linux/osx
- 2. IOCTL寫入崩潰
- 3. PhantomJS在Linux上的phantom.exit()後崩潰
- 4. 片段在後臺崩潰後崩潰
- 5. Eclipse的崩潰在Linux上
- 6. Aptana在Ubuntu linux崩潰
- 7. 在linux上的Matlab崩潰
- 8. eclipse java - 在linux上崩潰
- 9. iOS8.1中文手寫輸入法崩潰
- 10. SD卡寫入方法崩潰在AlarmReceiver
- 11. lhsh在C中的lh_insert崩潰 - Linux?
- 12. Yeoman在第一次輸入後崩潰
- 13. Spritekit在進入後臺時崩潰
- 14. ios:crashValueForKeyPath後崩潰
- 15. 崩潰後sprite.runAction
- 16. 寫答案崩潰
- 17. Linux TCP套接字崩潰
- 18. Linux上的崩潰分析
- 19. usb_register_dev崩潰的Linux內核
- 20. 本地Java崩潰Linux
- 21. 此OpenMP代碼崩潰linux
- 22. 寫入(socket,buff,length)會導致崩潰
- 23. Android應用程序:在後臺崩潰,然後再次崩潰
- 24. 寫入sqlite數據庫(iOS)時崩潰後應該怎麼做?
- 25. SocketRocket在connectionDidFinishLoading後崩潰
- 26. Xcode在啓動後崩潰
- 27. Listview在啓動後崩潰
- 28. Android:MediaPlayer在3秒後崩潰
- 29. Mono(linux)中的DLLImport崩潰:icall_wrapper_mono_marshal_free
- 30. mysql在amazon linux ami上崩潰
可能[重複](http://stackoverflow.com/questions/5132343/how-does-behave-linux-buffer-cache-when-an-application-is-crashing-down)。 –
@ 111111如果您擔心事務完整性,則不能使用'std :: ofstream',因爲它沒有保證磁盤同步的選項。通常,您將使用'std :: ostringstream'來構造記錄(如果文件是面向文本的),然後使用'write()'在一個原子動作中輸出該記錄。 –
@ 111111在你的進程崩潰的情況下,RAII不會爲你購買任何東西(當然,如果系統崩潰,甚至更少)。 –