2011-10-05 55 views
4

在某些情況下,編碼器不能依靠系統調用是原子的,例如,如果該文件位於NFS文件系統上。 (c.f. NFS Overview, FAQ and HOWTO Documents)。但是大多數數據庫工作最終都需要原子系統調用。 (c.f. Atomicity of database systems)。程序員如何確定「寫入」系統調用是否在特定文件上是原子的?

是否存在一個標準(和操作系統無關)確認寫入(和其他系統調用)的方式在C(或python)中的特定FILE上是原子的。

有什麼建議嗎?

隨後的說明:原子性的管道在下面的討論:

注中,特別是 「人」 的網頁中提取與O_APPEND專門處理:

如果設置了文件狀態標誌的O_APPEND標誌,文件 偏移量應在每次寫入之前設置爲文件末尾,並且不應在文件偏移量和寫入操作發生變化 之間發生介入文件修改操作 。

+2

我想你會發現數據庫不需要原子系統調用:它們需要對數據庫進行原子更新的*外觀*,但是這是使用事務日誌完成的。在任何時候,實際的數據庫文件可能不一致,但事務日誌包含所需的信息以使其再次保持一致。 – Duncan

+0

NFS只是充滿了高度破碎,不符合規範的行爲,使其不適用於大多數用途。使用smb/cifs/9p/anything-but-nfs用於嚴重的網絡文件系統使用。 –

+0

大多數數據庫採用的方法似乎是在*「不要在NFS上運行此操作」*行的文檔中突出註釋。 – caf

回答

4

POSIX中定義的write調用根本沒有原子性保證。所以你不需要確認任何東西,它不是原子的。

如果成功完成,它甚至不保證數據將到達硬盤驅動器(如果有驅動器)。成功讀回數據也不會給你任何保證。

您需要使用sync系列函數來獲得一些耐久性保證。

+4

'write'對管道有一些原子性保證,並且它爲普通文件提供了訂購保證。 –

+0

問題在標題中說明「文件」並討論數據庫工作。雖然你是對的,但我真的不希望提供者能夠依靠這些爲ACID類型工作提供的保證。 – Mat

相關問題