2012-07-06 114 views
1

我正在用C++編寫一個模塊,它將在一組機器上運行,所有這些機器都有一個nfs掛載文件存儲。避免在NFS共享文本文件上同時寫入

我有一個配置文件與所有的機器通過NFS共享;並且所有人都可以讀取/寫入該文件。如何確保不會因同時訪問而導致數據損壞?

我知道NFS有自己的鎖定協議,但我看到它不可靠 - concurrent nfs access。我也看到iNotify在nfs安裝的驅動器上不太好 - inotifiy example。我不確定stat將有助於檢查在寫入/讀取之前是否正在訪問文件。

如何在C++中實現一個簡單的鎖定機制以避免同時訪問?

+2

...通過不嘗試同時寫入同一文件。寫入文件的唯一副本,並使用重命名重新轉向舊文件。 – Petesh 2012-07-06 20:09:50

+0

......換句話說,如果文件是本地文件,則完全可能與您應該做的事情完全相同。 – Celada 2012-07-06 20:16:49

+0

這對我來說不是一個選項,因爲文件(使用它的fd)正在被IPC(unix域套接字)跟蹤以進行更改。所做的更改將傳回模塊以供進一步處理。 – sillysheep 2012-07-06 20:18:51

回答

0

當您將內容A,B和C同時寫入通過NFS共享的文件時,最終內容可能是ABC或任何ABC的可能組合,如BAC,CAB等。文件將始終爲一致,它將永遠不會寫A部分,其次是B,因此寫一個接一個地發生。請注意,只有當內容大小在NFS塊大小範圍內時纔會如此。

如果寫入超出塊大小,則需要使用NLM,這需要在NFS服務器和客戶端上運行鎖定守護進程。

+0

我沒有框架的問題標題正確,我的壞,我想避免同時'訪問',而不僅僅是寫道。即使同時寫入不會是一個問題,同時讀/寫將是。一個鎖定機制,以避免這是我感興趣的。 – sillysheep 2012-07-10 04:31:18