假设我有两个进程。一个总是驻留在内存中,并定期从磁盘上的文件中读取一些设置。如果它检测到设置已更改,则应用它们。
另一个进程根据需要在命令行下运行并修改设置。因此,第一个进程只读取文件而从不写入,而第二个进程只能写入文件。
我是否应该同步对文件的访问以确保第一个进程始终获得一致的设置,即在修改之前或之后而不是一些中间内容?如果是,那么在 C++ 中执行此操作的最简单方法是什么。
我主要对跨平台方式感兴趣。但也对特定于 Windows 和/或 Linux 的产品感到好奇。
假设我有两个进程。一个总是驻留在内存中,并定期从磁盘上的文件中读取一些设置。如果它检测到设置已更改,则应用它们。
另一个进程根据需要在命令行下运行并修改设置。因此,第一个进程只读取文件而从不写入,而第二个进程只能写入文件。
我是否应该同步对文件的访问以确保第一个进程始终获得一致的设置,即在修改之前或之后而不是一些中间内容?如果是,那么在 C++ 中执行此操作的最简单方法是什么。
我主要对跨平台方式感兴趣。但也对特定于 Windows 和/或 Linux 的产品感到好奇。
使用命名信号量并要求任一进程在编辑磁盘上的文件之前保存信号量。任何正在运行的应用程序都可以连接命名信号量。
查看man 7 sem_overview
有关 Linux 机器上命名信号量的更多信息。
我能找到的与 Windows 最接近的等价物是http://msdn.microsoft.com/en-us/library/windows/desktop/ms682438(v=vs.85).aspx
您正在使用 C++,因此您的第一个选择应该是检查通常的跨平台库 - POCO、Boost、ACE等等,看看是否有任何东西已经满足您的要求。
您确实有两个不同的问题:(1)文件同步和(2)通知。
在 Linux 上,为了避免让您的守护进程不断轮询以查看文件是否已更改,您可以使用inotify 调用并设置事件,以便在命令行程序更改文件时告诉您。查找 IN_CLOSE_WRITE 事件可能是最简单的,因为 CL 程序可能会打开、更改和关闭文件。
最明显的解决方案是以独占模式打开文件。如果文件无法打开,请稍等片刻,然后再次尝试打开文件。这将防止可能的访问/修改冲突。
这种方法的好处是简单并且没有明显的缺点。
当然,您可以使用一些同步原语(互斥体,信号量取决于操作系统),但这在您的场景中将是一个过度杀伤,当不需要快速响应时(在打开尝试之间等待 200 毫秒就可以了,并且写入配置文件不会' t 采取更多)。