UNIX命令mv和rm如何使用打开的文件?

如果我正在读取存储在NTFS文件系统上的文件,并且在读取文件时尝试移动/重命名该文件,则无法执行此操作。 如果我在UNIX文件系统(如EXT3)上尝试这种方法,则会成功,读取过程不受影响。 我甚至可以读取文件,读取过程不受影响。 这个怎么用? 有人可以向我解释为什么在UNIX文件系统下支持这种行为,但不支持NTFS? 我有一个模糊的感觉,它与硬链接和inode有关,但我会很感激一个很好的解释。

Unix文件系统使用引用计数和两层体系结构来查找文件。

文件名是指信息节点或索引节点称为inode的东西。 inode存储(指向)文件内容以及一些元数据,如文件的类型(普通,目录,设备等)以及谁拥有它。

多个文件名可以引用相同的inode; 他们被称为硬链接 。 另外, 文件描述符 (fd)是指inode。 fd是打开文件时进程获得的对象的类型。

Unix文件系统中的文件只有当最后一个文件引用消失时才会消失,所以当没有更多的文件名(硬链接)或fd引用它时。 所以, rm实际上并没有删除一个文件; 它删除文件的引用

这个文件系统设置可能看起来很混乱,有时会带来问题(尤其是NFS),但是它的好处是锁定对于很多应用程序来说并不是必需的。 许多Unix程序也通过打开临时文件并立即删除它们来利用这种情况。 一旦他们终止,即使他们崩溃,临时文件已经消失。

在unix上,一个文件名就是一个到实际文件(inode)的链接。 打开一个文件也会创建一个(临时的)链接到实际的文件。 当一个文件的所有链接都消失(rm和close())时,文件被删除。

在NTFS上,逻辑上文件名文件。 从文件名到文件metainfo没有间接层,它们是同一个对象。 如果你打开它,它正在使用,不能被删除,就像unix上的实际文件(inode)在使用时不能被删除一样。

Unix:文件名 – > FileInfo – >文件数据

NTFS:FileName / FileInfo – >文件数据