我有许多写文件的进程(任何文件都可以写一次)。他们打开、写入和关闭文件。我也有许多进程是读取文件。文件大小可以不同。需要这样:当某个进程试图读取此时正在写入的文件时,我需要在写入后关闭文件时读取全部内容。我需要锁定写入并等待读取解锁。重要提示:如果文件读取文件并且不能这样做,它会自行写入文件。1.尝试读取文件 2.如果文件不存在,写入文件
因此,对于异步模式,可能有超过 1 个进程因为无法读取文件而想要写入文件。我需要锁定文件写入,所有读者都应该等待这个
文件锁定是操作系统特定的东西。
类 Unix 系统
类 Unix 系统通常支持flock()
,fcntl()
和lockf()
系统调用。但是,除了lockf
咨询锁之外,它不是 Posix 标准的一部分,因此您需要查阅特定于操作系统的文档。
Linux 的文档在这里:
请注意,fcntl()
它不仅可以锁定,还可以做很多事情。
另请注意,在大多数情况下,锁定类 unix 系统是建议性的 - 即合作努力。双方都必须参与,并且可以简单地忽略锁定。强制锁定是可能的,但未在典型范例中使用。
视窗
在 Windows中,强制文件CreateFile
锁(共享模式与这并不意味着文件那么大)。LockFileEx
0xffffffff
0xffffffffffffffff
备择方案
您描述的场景的另一种选择是简单地创建具有不同名称的文件,然后在完成后重命名它。
例如,如果文件被命名为“data-20130719-112258-99823.csv”而不是创建一个名为“tmpdata-20130719-112258-99823.csv.tmp”的文件,那么当它被完全写入时,重命名它。
处理此问题的标准方法是写入临时文件名,然后在写入完成后重命名文件。
等待文件的其他进程需要监视真实文件的存在(使用文件系统监视程序或类似机制)。当文件“出现”时,写入已经完成。