4

在 Linuxdd上,我可以在硬盘驱动器上创建一个文件,然后在 dd 仍在进行时在 Nautilus 中将其删除。

Linux 可以强制强制文件锁定来保护 R/W 吗?

[编辑] 最初的问题不是关于 linux 文件锁定功能,而是关于 linux 中的一个假定错误,在这里复制它,因为它在下面得到回应,其他人可能有同样的问题。

人们一直告诉我 Linux/Unix 是更好的操作系统。我现在在 Linux 上编写 Java 并遇到一个问题,我可以很容易地重现:我可以在我的硬盘驱动器上 dd 一个文件并在 dd 仍在进行时在 Nautilus 中删除它。为什么linux不能强制强制文件锁来保护R/W?

4

3 回答 3

16

要在 Linux 上进行强制锁定,必须使用该-o mand选项挂载文件系统,并且您必须设置g-x,g+s文件的权限。也就是说,您必须禁用组执行,并启用 setgid。一旦执行此操作,所有访问都将根据文件描述符EAGAIN上的值阻塞或出错。O_NONBLOCK但请注意:“在所有已知版本的 Linux 中强制锁定的实现都受到竞争条件的影响,这使其不可靠……因此,不建议依赖强制锁定。” 见fcntl(2)

于 2013-01-09T11:29:58.730 回答
11

你不需要锁定。这不是错误,而是选择,您的假设是错误的。

文件系统使用引用计数,只有当文件的所有硬链接都被删除并且所有文件描述符都关闭时,它才会将文件标记为空闲。

这种方法允许安全的文件系统操作,例如,Windows 不允许。删除、移动和重命名正在使用的文件等操作,无需锁定或破坏任何内容。

尽管删除了文件,您的dd操作仍将成功,这实际上将推迟到dd完成。

http://en.wikipedia.org/wiki/Reference_counting#Disk_operating_systems

[编辑]我的回答现在没有多大意义,因为问题是由其他人编辑的。最初的问题是关于 linux 中的一个假定错误,而不是关于 linux 是否可以锁定文件:

人们一直告诉我 Linux/Unix 是更好的操作系统。我现在在 Linux 上编写 Java 并遇到一个问题,我可以很容易地重现:我可以在我的硬盘驱动器上 dd 一个文件并在 dd 仍在进行时在 Nautilus 中删除它。为什么linux不能强制强制文件锁来保护R/W?

于 2012-08-21T20:45:29.703 回答
1

Linux 和 Unix 操作系统可以强制执行文件锁定,但默认情况下不会这样做,因为它的多用户设计。flock尝试阅读和的手册页fcntl。这可能会让你开始。

于 2012-08-21T20:31:27.650 回答