场景:我有许多需要从网络上获取文件的进程。如果文件已经下载,我希望将它缓存在磁盘上。如果另一个进程正在下载该文件,则阻塞直到下载完成。
我一直在尝试找到最简单的方法来实现这一点。显而易见的方法是:
这个系统似乎没有竞争条件,实现了上述目标。
不幸的是,我找不到关于如何使用open()等在Linux中创建锁定文件的文档。如果我将创建步骤分为:
现在“创建”和“锁定”之间存在竞争条件(非创建进程在创建者之前获取锁)。
我意识到我可以针对每个文件使用外部锁文件(例如文件名+'.lock'),在尝试创建文件名之前获取它,但这感觉...不优雅(我现在需要担心实际上带有.lock后缀的文件!)
是否有一种方法可以原子地创建和锁定它(如Windows所提供的),或者外部锁文件方法基本上是标准/必需的?
我一直在尝试找到最简单的方法来实现这一点。显而易见的方法是:
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
现在“创建”和“锁定”之间存在竞争条件(非创建进程在创建者之前获取锁)。
我意识到我可以针对每个文件使用外部锁文件(例如文件名+'.lock'),在尝试创建文件名之前获取它,但这感觉...不优雅(我现在需要担心实际上带有.lock后缀的文件!)
是否有一种方法可以原子地创建和锁定它(如Windows所提供的),或者外部锁文件方法基本上是标准/必需的?