我的程序正在写入二进制文件,并且该程序可能有多个实例为同一用户访问同一二进制文件。在Unix / Linux中,我看到一些程序(尤其是守护进程)锁定了一个空的锁定文件,而不是需要锁定的实际共享数据(因此,它们锁定~/.data/foo
而不是锁定~/.data/foo.lck
)。锁定实际文件与空锁定文件的利弊是什么?
答案 0 :(得分:1)
flock
(Linux直到2.6.12才支持它)。另一方面,O_CREAT|O_EXCL
在更多文件系统上的可靠性更高,并且运行时间更长。
即使在网络文件系统上确实支持flock
的系统上(或在您不需要这种灵活性的情况下),O_CREAT|O_EXCL
与flock
一起也是非常有用的,因为它可以区分干净关机和非干净关机。 flock
会自动消失,但也无法区分为什么消失。
对文件本身进行植群可防止原子写入(复制,擦除旧文件,重命名),或在任何其他情况下可能会擦除现有文件的情况。有时,“实际文件”在程序的整个运行过程中并不总是具有相同的inode。因此,在这些情况下,单独的文件也更加方便。在那些foo.lck
情况下,这种情况非常普遍,因为通常您会在短时间内锁定foo
,并可能会在此过程中将其删除。
答案 1 :(得分:0)
我看到了空锁文件的三个缺点:
我看到了修改实际文件名的一个缺点:
很明显,我看到了空锁文件的一大优势:
顺便说一句,我相信这个问题更适合SoftwareEngineering社区。 p>