簡體   English   中英

從兩個進程安全訪問文件

[英]Safe access to file from two processes

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

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

我是否應該同步對文件的訪問以確保第一個進程始終獲得一致的設置,即在修改之前或之后不是某些中間內容? 如果是,那么在C ++中執行此操作的最簡單方法是什么。

我主要對跨平台方式感興趣。 但也對Windows和/或Linux特定的那些感到好奇。

使用命名信號量並在編輯磁盤上的文件之前要求任一進程保存信號量。 任何正在運行的應用程序都可以連接命名信號量。

查看man 7 sem_overview以獲取有關linux機器上命名信號量的更多信息。

我能找到的最接近Windows的等價物是http://msdn.microsoft.com/en-us/library/windows/desktop/ms682438(v=vs.85).aspx

您正在使用C ++,因此您的第一個選擇應該是檢查通常的跨平台庫 - POCOBoostACE等,以查看是否有任何已經滿足您需要的內容。

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

在Linux上,為避免讓守護程序不斷輪詢以查看文件是否已更改,您可以使用inotify調用並設置事件,這些事件將告訴您文件何時被命令行程序更改。 查找IN_CLOSE_WRITE事件可能最簡單,因為CL prog可能會打開,更改和關閉文件。

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

最明顯的解決方案是以獨占模式打開文件。 如果無法打開文件,請等待一段時間再嘗試打開該文件。 這將防止可能的訪問/修改沖突。

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

當然你可以使用一些同步原語(Mutex,信號量取決於操作系統),但這在你的場景中是一種矯枉過正,當不需要快速響應時(在打開嘗試之間等待200毫秒就可以了,並且編寫配置文件贏了'采取更多)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM