锁定实际文件与空锁定文件的利弊是什么?

时间:2019-03-12 12:19:46

标签: unix

我的程序正在写入二进制文件,并且该程序可能有多个实例为同一用户访问同一二进制文件。在Unix / Linux中,我看到一些程序(尤其是守护进程)锁定了一个空的锁定文件,而不是需要锁定的实际共享数据(因此,它们锁定~/.data/foo而不是锁定~/.data/foo.lck)。锁定实际文件与空锁定文件的利弊是什么?

2 个答案:

答案 0 :(得分:1)

NFS或其他网络文件系统均不为所有版本的unix支持

flock(Linux直到2.6.12才支持它)。另一方面,O_CREAT|O_EXCL在更多文件系统上的可靠性更高,并且运行时间更长。

即使在网络文件系统上确实支持flock的系统上(或在您不需要这种灵活性的情况下),O_CREAT|O_EXCLflock一起也是非常有用的,因为它可以区分干净关机和非干净关机。 flock会自动消失,但也无法区分为什么消失。

对文件本身进行植群可防止原子写入(复制,擦除旧文件,重命名),或在任何其他情况下可能会擦除现有文件的情况。有时,“实际文件”在程序的整个运行过程中并不总是具有相同的inode。因此,在这些情况下,单独的文件也更加方便。在那些foo.lck情况下,这种情况非常普遍,因为通常您会在短时间内锁定foo,并可能会在此过程中将其删除。

答案 1 :(得分:0)

我看到了空锁文件的三个缺点:

  • 目录的用户权限应允许您创建文件。
  • 万一磁盘空间出现问题,这可能会失败。
  • 万一您的程序崩溃了,锁定文件仍然存在。

我看到了修改实际文件名的一个缺点:

  • 万一您的程序崩溃了,您的文件将被更改(只有文件名,但可能会造成混乱)。

很明显,我看到了空锁文件的一大优势:

  • 您的原始文件完全不变。

顺便说一句,我相信这个问题更适合SoftwareEngineering社区。