2013-08-03 52 views
0

假設我有兩個進程。一個總是駐留在內存中並定期從磁盤上的文件中讀取一些設置。如果它檢測到設置已更改,則會應用它們。從兩個進程安全地訪問文件

其他進程在命令行下按需運行並修改設置。因此,第一個進程只能讀取文件,而不能寫入文件,而第二個進程只能寫入文件。

我是否應該同步對文件的訪問以確保第一個進程始終得到一致的設置,即在修改之前或之後不是某些中間內容?如果是的話,在C++中最簡單的方法是什麼?

我很感興趣,主要是跨平臺的方式。但也對Windows和/或Linux特有的好奇。

回答

1

您使用的是C++所以你的第一選擇應該是通過正常的跨平臺庫檢查 - POCOBoostACE,等等,看是否有什麼已經做到了你所需要的。

你真的有兩個單獨的問題:(1)文件同步和(2)通知。

在Linux上,爲避免讓守護進程持續輪詢以查看文件是否發生了更改,可以使用inotify calls並設置事件,這些事件會告訴您文件何時被命令行程序更改。查找IN_CLOSE_WRITE事件可能是最簡單的,因爲CL prog可能會打開,更改和關閉文件。

對於同步,由於您在控制這兩個程序,因此您可以使用文件或記錄鎖定,例如, lockfflockfcntl

0

最明顯的解決方案是以獨佔模式打開文件。如果文件無法打開,請稍等片刻,然後嘗試再次打開文件。這將防止可能的訪問/修改衝突。

這種方法的好處是它很簡單並且沒有明顯的缺點。

當然你可以使用一些同步原語(Mutex,Semaphore取決於操作系統),但是如果不需要快速響應(在開放嘗試之間等待200毫秒是正常的,寫入配置文件不會更多)。