UsA*_*R33 10 linux file-io flock fcntl
场景:我有很多进程需要通过网络获取文件.如果文件已经下载,我希望它缓存在磁盘上.如果另一个进程正在下载该文件,则阻止直到完成下载.
我一直在努力寻找最简单的方法.显而易见的方法是:
create file w/ an exclusive lock active on it only if it doesn't exist (O_CREAT | O_EXCL)
if file exists already:
   open file and acquire exclusive lock
else:
   download to newly created file
release lock
该系统通过(看似)没有竞争条件来实现上述目标
不幸的是,我找不到有关如何使用open()等创建一个在Linux中锁定的文件的文档.如果我将创建步骤拆分为:
open w/ O_CREAT | O_EXCL
flock
现在,创建和锁定之间存在竞争条件(非创建进程在创建者执行之前获取锁定).
我意识到我可以在每个文件中使用一个外部锁定文件(例如filename +'.lock),这是我在尝试创建文件名之前获得的,但这感觉...不优雅(我现在需要担心如何实际拥有一个文件.lock后缀!)
反正原子创建和锁定它(如Windows提供)或外部锁定文件方法几乎是标准/必需的?
无论如何,比赛仍然存在.如果文件可能存在,也可能不存在,那么在尝试锁定之前必须先测试它的存在.但是如果文件是你的互斥锁,那么你就不可能这样做,"如果文件已经存在"(假)和"下载到新创建的文件"之间的空间是不受约束的.另一个过程可能来自创建文件并在下载开始之前开始下载,你会破坏它.
基本上不要在这里使用fcntl锁,使用文件本身的存在.  open()如果文件已存在,则O_CREAT和O_EXCL将失败,告诉您其他人先到达那里.
| 归档时间: | 
 | 
| 查看次数: | 5458 次 | 
| 最近记录: |