如何在写入文件时等待
本文关键字:文件 等待 | 更新日期: 2023-09-27 18:23:58
我有很多写文件的进程(任何文件都可以写一次)。他们打开、写入和关闭文件。此外,我有许多进程是读取文件。文件大小可以多种多样。需要这样:当一些进程试图读取此时正在写入的文件时,我需要在写入后关闭文件时读取全部内容。我需要在写时锁定,在读时等待解锁。重要提示:若文件读取文件,但不能执行此操作,它将自己写入文件。1.尝试读取文件2.如果文件不存在,则写入文件
因此,对于异步模式,可能有不止一个进程因为无法读取文件而想要写入文件。我需要锁定文件写入,所有读取器都应该等待这个
文件锁定是操作系统特有的事情。
- https://en.wikipedia.org/wiki/File_locking
类Unix系统
类Unix系统通常支持flock()
、fcntl()
和lockf()
系统调用。但是,除了lockf
咨询锁之外,它不是Posix标准的一部分,因此您需要查阅特定于操作系统的文档。
Linux文档在这里:
- http://linux.die.net/man/3/lockf
- http://linux.die.net/man/2/fcntl
- http://linux.die.net/man/2/flock
注意,fcntl()
做了很多事情,而不仅仅是锁定。
还要注意的是,在大多数情况下,锁定类unix系统是一种咨询性的工作,即一种合作性的工作。双方都必须参与,而忽略锁定是有可能的。强制锁定是可能的,但在典型的范例中不使用。
Windows
在windows中,强制文件锁定(与CreateFile
共享模式)和范围锁定LockFileEx
是正常的,咨询锁定不可用,尽管它们可以被模拟(通常在0xffffffff
或0xffffffffffffffff
处使用一个字节的范围锁定-锁定的部分实际上不必存在,所以这并不意味着文件有那么大)。
替代方案
对于所描述的场景,另一种选择是简单地创建具有不同名称的文件,然后在完成后重命名它。
例如,如果文件名为"data-2013079-112258-99823.csv",而不是创建一个名为"tmpdatea-201300719-11225899823.csv.tmp"的文件,则在文件完全写入后,将其重命名。
处理此问题的标准方法是写入临时文件名,然后在写入完成后重命名该文件。
其他等待文件的进程需要监视真实文件的存在(使用文件系统观察器或类似机制)。当文件"出现"时,说明写入已完成。