UNIX命令mv和rm如何处理打开的文件?

14

如果我正在读取存储在NTFS文件系统上的文件,并且在仍在读取时尝试移动/重命名该文件,那么我将无法这样做。但是,如果我在UNIX文件系统(如EXT3)上尝试此操作,则成功,并且进行读取的进程不受影响。我甚至可以删除该文件,而读取进程也不受影响。这是如何实现的?有人能向我解释为什么UNIX文件系统支持这种行为,而NTFS不支持吗?我有一种模糊的感觉,这与硬链接和inode有关,但我希望得到一个好的解释。

2个回答

30
Unix文件系统使用引用计数和两层架构来查找文件。
文件名指的是inode,即信息节点或索引节点。inode存储(指向)文件内容以及一些元数据,例如文件类型(普通、目录、设备等)和所有者。
多个文件名可以引用同一个inode;它们被称为硬链接。此外,文件描述符(fd)也引用inode。当进程打开文件时,fd是它获得的对象类型。
Unix文件系统中的文件只有在最后一个引用消失时才会消失,因此当没有更多名称(硬链接)或fd引用它时才会消失。因此,rm实际上并未删除文件;它删除了对文件的引用。
这种文件系统设置可能看起来令人困惑,并且有时会带来问题(特别是与NFS相关),但它的好处在于许多应用程序不需要锁定。许多Unix程序还利用这种情况,打开一个临时文件并立即将其删除。即使它们崩溃,一旦它们终止,临时文件也会消失。

我能移动打开的文件到任何地方吗?比如说只能在同一个文件系统内移动吗? - ivan_pozdeev
1
@ivan_pozdeev在不同的文件系统中执行mv操作实际上会复制数据并删除原始文件,在这种情况下类似于打开文件的rm - Daniël Sonck

6
在Unix中,文件名仅是指向实际文件(inode)的链接。打开文件也会创建一个(临时)指向实际文件的链接。当所有指向文件的链接都消失(使用rm和close()函数),则该文件将被删除。
在NTFS上,逻辑上文件名就是文件本身。从文件名到文件元信息没有间接层,它们是同一对象。如果你打开文件,则文件正在使用中,无法被删除,就像在Unix上实际文件(inode)在使用时无法被删除一样。
Unix:文件名 ➜ 文件信息 ➜ 文件数据
NTFS:文件名 + 文件信息 ➜ 文件数据

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接