C ++如何检查文件是否正在使用 - 多线程多进程系统

时间:2012-02-17 21:34:54

标签: c++ multithreading filesystems multiprocess

C ++: 有没有办法检查文件是否已被另一个进程/类/设备打开以供写入?

我正在尝试从其他进程可以访问的文件夹中读取文件进行写入。如果我读取同时写入的文件,则读取和写入过程都会给出错误(写入不完整,我可能只会得到标题)。 因此,在决定是否打开该特定文件之前,我必须检查某种类型的条件。 我一直在使用boost :: filesystem来获取我的文件列表。我希望兼容Unix和Windows。

3 个答案:

答案 0 :(得分:2)

您必须使用文件顾问锁。在Unix中,这是flock,在Windows中是LockFile

但是,读取进程错误的事实可能表示您尚未在该进程中以只读模式打开文件。您必须为只读访问指定正确的标志,或者从OS'透视,你有两位作家。

这两种操作系统都支持读写器锁定,允许无限制读取,但只有在没有编写器的情况下,并且一次最多只能有一个写入者访问。

由于您说您的系统是多进程(即,不是多线程),您不能使用条件变量(除非它' s在进程间共享内存中)。您也不能使用单个作家作为协调员,除非您愿意通过套接字或共享内存将数据传送到那里。

答案 1 :(得分:1)

根据我对boost::filesystem的理解,您无法从该功能集中获得所需的粒度,以便执行您要求的任务。一般来说,您可以采取两种不同的方法:

  1. 使用同步机制,例如在文件系统级别可见的命名信号量
  2. 在POSIX系统上使用文件锁(即fcntlflock
  3. 不幸的是,这两种方法都是特定于平台的,或者至少特定于POSIX与Win32。

答案 2 :(得分:1)

使用Sutter的活动对象https://sites.google.com/site/kjellhedstrom2/active-object-with-cpp0x

可以找到一个非常好的解决方案

这是非常先进的,但在许多核心上确实很好。