Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 什么是pro';s和con';锁定实际文件与锁定空文件的区别是什么?_Unix - Fatal编程技术网

Unix 什么是pro';s和con';锁定实际文件与锁定空文件的区别是什么?

Unix 什么是pro';s和con';锁定实际文件与锁定空文件的区别是什么?,unix,Unix,我的程序正在写入二进制文件,可能有多个程序实例为同一用户访问同一个二进制文件。在Unix/Linux中,我看到一些程序(特别是守护进程进程)锁定了一个空的锁文件,而不是需要锁定的实际共享数据(因此,它们没有锁定~/.data/foo,而是锁定~/.data/foo.lck)。锁定实际文件与锁定空文件的优缺点是什么?我认为锁定空文件有三个缺点: 目录的用户权限应允许您创建文件 如果磁盘空间出现问题,此操作可能会失败 如果程序崩溃,锁文件仍然存在 我看到了修改实际文件名的一个缺点: 如果您的程

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

我认为锁定空文件有三个缺点:

  • 目录的用户权限应允许您创建文件
  • 如果磁盘空间出现问题,此操作可能会失败
  • 如果程序崩溃,锁文件仍然存在
我看到了修改实际文件名的一个缺点:

  • 如果您的程序崩溃,您的文件已被更改(仅文件名,但可能会产生混淆)
显然,我看到了空锁文件的一大优点:

  • 您的原始文件根本不会更改

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

flock
在NFS或其他网络文件系统上不支持所有版本的unix(Linux直到2.6.12才支持它)。另一方面,
O|u create | O|u EXCL
在更多的文件系统上更可靠,而且这种情况持续了更长的时间

即使在网络文件系统上支持
flock
的系统上(或者在您不需要这种灵活性的情况下),
O|u CREAT | O|u EXCL
flock
一起使用也是非常有用的,因为它区分了干净关机和非干净关机
flock
会自动消失,但它也无法区分它消失的原因


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

谢谢。一些评论。empty的缺点2:在很多情况下,当磁盘已满时,我认为仍然可以创建一个空文件,因为它只向目录的inode添加一个项,而不是分配一个新的inode。empty的骗局3肯定是个骗局,但不是一个严重的骗局。实际的缺点1:我认为这与锁定问题是正交的;这是一个原子写入问题,应该通过使用临时文件来解决。empty的赞成者1:我不确定我是否遵守了。当然,当我发出一个锁时,我的意图是修改数据(原始文件),不管我锁定的是哪个文件。也感谢社区的建议。我不知道它存在。谢谢,历史课对锁文件存在的原因很有见解。