我的程序正在写入二进制文件,并且该程序可能有多个实例访问同一用户的同一二进制文件。在UNIX/Linux中,我看到了一些程序(尤其是守护程序进程)锁定一个空锁定文件,而不是需要锁定的实际共享数据(因此,它们不是锁定~/.data/foo
,而是锁定~/.data/foo.lck
)。锁定实际文件与空锁定文件有哪些优点?
flock
不受NFS或所有版本的其他网络文件系统的支持(直到2.6.12,Linux甚至不支持Linux)。另一方面,O_CREAT|O_EXCL
在更多的文件系统上更可靠,并且已经更长了。
即使在网络文件系统上支持flock
的系统上(或您不需要这种灵活性的情况),O_CREAT|O_EXCL
与flock
一起也非常有用,因为它可以区分干净的关闭和非清洁关闭。 flock
有助于自动消失,但这也无需区分为什么它消失了。
蜂拥而至的文件本身可以防止原子写作(副本,擦除旧,重命名)或任何其他可能删除现有文件的情况。有时,"实际文件"在整个程序的整个运行中并不总是具有相同的inode。因此,在这种情况下,单独的文件也更加方便。这在这些foo.lck
情况下非常常见,因为通常您在短时间内锁定foo
,并且可能在此过程中删除。
我看到一个空锁定文件的三个弊端:
- 目录的用户权限应允许您创建一个文件。
- 在磁盘空间问题的情况下,这可能会失败。
- 如果您的程序崩溃,Lockfile仍然存在。
我看到一个修改实际文件的名称的骗局:
- 如果您的程序崩溃,您的文件已更改(只有文件名,但可能会引起混乱)。
显然,我看到空锁定文件的一个大优势:
- 您的原始文件根本不会更改。
顺便说一句,我相信这个问题更适合软件工程社区。