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