场景:我有许多正在运行的进程需要通过网络获取文件。如果文件已经下载,我希望它缓存在磁盘上。如果另一个进程正在下载文件,则阻塞直到下载完成。
我一直在努力寻找最简单的方法来做到这一点。显而易见的方法是:
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 提供的那样),或者外部 lockfile 方法几乎是标准/必需的?