C ++:有没有办法检查文件是否已打开以供另一个进程/类/设备写入?
我正在尝试从其他进程可以访问的文件夹中读取文件以进行写入。如果我读取一个同时被写入的文件,读取和写入过程都会给我错误(写入不完整,我可能只会得到一个标题)。因此,在决定是否打开该特定文件之前,我必须检查某种类型的条件。我一直在使用 boost::filesystem 来获取我的文件列表。我希望与 Unix 和 Windows 兼容。
C ++:有没有办法检查文件是否已打开以供另一个进程/类/设备写入?
我正在尝试从其他进程可以访问的文件夹中读取文件以进行写入。如果我读取一个同时被写入的文件,读取和写入过程都会给我错误(写入不完整,我可能只会得到一个标题)。因此,在决定是否打开该特定文件之前,我必须检查某种类型的条件。我一直在使用 boost::filesystem 来获取我的文件列表。我希望与 Unix 和 Windows 兼容。
您必须使用文件咨询锁。在 Unix 中是flock
,在 Windows 中是LockFile
。
但是,您的读取过程出错的事实可能表明您没有在该过程中以只读模式打开文件。您必须为只读访问指定正确的标志,或者从操作系统的角度来看,您有两个编写器。
两种操作系统都支持读写锁,允许无限的读取器,但只有在没有写入器的情况下,并且一次最多只有一个写入器可以访问。
由于您说您的系统是多进程(即,不是多线程),因此您不能使用条件变量(除非它在进程间共享内存中)。除非您愿意通过套接字或共享内存将数据传送到那里,否则您也不能使用单个编写器作为协调器。
据我了解boost::filesystem
,您不会从该功能集中获得所需的粒度来执行您请求的任务。一般来说,您可以采取两种不同的方法:
fcntl
或flock
在 POSIX 系统上)不幸的是,这两种方法都将是特定于平台的,或者至少特定于 POSIX 与 Win32。
使用 Sutter 的活动对象https://sites.google.com/site/kjellhedstrom2/active-object-with-cpp0x可以在这里找到一个非常好的解决方案
这是相当先进的,但在许多核心上确实可以很好地扩展。