繁体   English   中英

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

[英]C++ how to check if file is in use - multi-threaded multi-process system

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

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

您必须使用文件咨询锁 在Unix中,这是flock ,在Windows中,这是LockFile

但是,您的读取过程出错的事实可能表明您在该过程中尚未以只读模式打开文件。 您必须为只读访问指定正确的标志,或者从操作系统的角度来看,您有两个编写器。

两种操作系统均支持读写器锁,其中允许无限制的读写器,但只有在没有写入器的情况下,一次最多只能有一个写入器。

因为您说系统是多进程的 (即,不是多线程的 ),所以您不能使用条件变量(除非它在进程间共享内存中)。 除非您愿意通过套接字或共享内存将数据穿梭在那里,否则您也不能使用单个编写器作为协调器。

据我对boost::filesystem了解,您不会从该功能集中获得所需的粒度,以执行您所请求的任务。 通常,您可以采用两种不同的方法:

  1. 使用同步机制,例如在文件系统级别可见的命名信号量
  2. 使用文件锁(即POSIX系统上的fcntlflock

不幸的是,这两种方法都将特定于平台,或者至少特定于POSIX与Win32。

在这里可以使用Sutter的活动对象https://sites.google.com/site/kjellhedstrom2/active-object-with-cpp0x找到一个非常好的解决方案

这是相当先进的,但在许多内核上确实可以很好地扩展。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM