从两个进程安全访问文件

时间:2013-08-03 18:39:50

标签: c++ linux winapi synchronization cross-platform

假设我有两个进程。一个总是驻留在内存中,并定期从磁盘上的文件中读取一些设置。如果它检测到设置已更改,则会应用它们。

另一个进程在命令行下按需运行并修改设置。因此,第一个进程只读取文件而从不写入文件,而第二个进程只能写入文件。

我是否应该同步对文件的访问以确保第一个进程始终获得一致的设置,即在修改之前或之后不是某些中间内容?如果是,那么在C ++中最简单的方法是什么。

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

3 个答案:

答案 0 :(得分:1)

使用命名信号量并在编辑磁盘上的文件之前要求任一进程保存信号量。任何正在运行的应用程序都可以连接命名的信号量。

查看man 7 sem_overview以获取有关linux机器上命名信号量的更多信息。

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

答案 1 :(得分:1)

您正在使用C ++,因此您的第一个选择应该是检查通常的跨平台库 - POCOBoostACE,等等,看看是否有任何内容已经做了你需要的。

您确实有两个不同的问题:(1)文件同步和(2)通知。

在Linux上,为避免让守护程序不断轮询以查看文件是否已更改,您可以使用inotify calls并设置事件,告诉您文件何时被命令行程序更改。查找IN_CLOSE_WRITE事件可能最简单,因为CL prog可能会打开,更改和关闭文件。

对于同步,由于您可以控制两个程序,因此您可以使用文件或记录锁定,例如lockfflockfcntl

答案 2 :(得分:0)

最明显的解决方案是以独占模式打开文件。如果无法打开文件,请等待一段时间再尝试打开该文件。这将防止可能的访问/修改冲突。

这种方法的好处在于它简单且没有明显的缺点。

当然你可以使用一些同步原语(Mutex,Semaphore,具体取决于操作系统),但是如果不需要快速响应(在打开尝试之间等待200毫秒,并且编写配置文件),那么在您的方案中这将是一种过度杀伤文件不会花费更多)。