2011-10-22 140 views
0

如何在數據已成功回撥的情況下回撥在Linux中寫入磁盤?寫入磁盤迴調的數據

我想將我的程序db文件映射到內存中進行讀/寫操作,並在寫入成功命中磁盤後接收回調。有點像舊的VMSs曾經做過的事情..

+0

您能否提供更多關於您已經嘗試的內容以及您遇到問題的部分代碼?在目前的形式下,這個問題可能會得到一個簡單的「是」或「否」的答案。 – chown

+0

我還沒有嘗試過任何東西。我正在尋找一種方法來確認數據實際上已被提交到磁盤。我研究過DBMS日誌記錄技術,但如果可能的話,我想盡量避免這種路徑...希望操作系統發出一個信號,告訴我已經完成將這個塊寫入磁盤。有這樣的事嗎? – gamedynamix

+0

無論如何,您可能需要使用日誌記錄 - 在發出寫入和同步完成時,如果系統在此刻斷電,則正在寫入(甚至部分)任何數據塊可能會完全丟失。 – bdonlan

回答

3

您需要調用fdatasync(或fsync,如果您確實需要同步元數據)並等待它返回。

你可以從另一個線程做到這一點,但是如果一個線程在另一個線程正在執行fdatasync()時寫入該文件,那麼將不清楚哪個寫入保證是持久的或不是。

想要以保證持久的方式存儲事務日誌的數據庫需要調用fdatasync。數據庫(如innodb)通常在其主數據文件中使用直接IO(以及它們自己的數據緩存,而不是依賴於操作系統),以便他們知道它將以可預測的方式寫入。

+0

這是正確的。如果你想要一個回調函數,只需使用一個執行寫操作的線程,調用'fdatasync()'/'msync()'或類似函數,然後調用你的回調函數。 – caf

+0

我不確定「簡單」如何適用於此。有一個線程進行回調可能不是OP想要的。 – MarkR

1

據我所知,當文件(或mmap ed區域)發生實際同步時,甚至不是文件的時間戳將要改變。但是,您可以使用fsync強制執行文件(或區域)的同步。

也很難看出你爲什麼要這樣做的原因。文件IO應該是不透明的。

+1

mmh ..我可以看到很多原因。 –

+0

我需要它的原因是,一旦寫入磁盤已被確認,我需要生成客戶收據。不能承受一個數據寫入磁盤的數據無法打開收據.. – gamedynamix

+0

@gamedynamix我建議你只要做你的寫和調用'fsync'這種方式,你可以確信數據被寫入並生成您的收據。 – pmr