【问题标题】:Safe access to file from two processes从两个进程安全访问文件
【发布时间】:2013-08-03 18:39:49
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    查看man 7 sem_overview,了解有关 Linux 机器上命名信号量的更多信息。

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

    【讨论】:

      【解决方案2】:

      您正在使用 C++,因此您的第一个选择应该是检查通常的跨平台库 - POCOBoostACE 等等,看看是否有任何东西已经满足您的需求.

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

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

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

      【讨论】:

        【解决方案3】:

        最明显的解决方案是以独占模式打开文件。如果文件无法打开,请稍等片刻,然后再次尝试打开文件。这将防止可能的访问/修改冲突。

        这种方法的好处是简单并且没有明显的缺点。

        当然,您可以使用一些同步原语(互斥体、信号量,具体取决于操作系统),但这在您的场景中将是过度杀伤力,因为不需要快速响应(在打开尝试之间等待 200 毫秒就可以了,并且写入配置文件不会占用更多)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-15
          相关资源
          最近更新 更多