如果我正在读取存储在 NTFS 文件系统上的文件,并且尝试在读取该文件时移动/重命名该文件,我将无法这样做。如果我在 UNIX 文件系统(例如 EXT3)上尝试此操作,它会成功,并且执行读取的进程不受影响。我什至可以 rm 文件并且读取过程不受影响。这是如何运作的?有人可以向我解释为什么这种行为在 UNIX 文件系统下受支持,但在 NTFS 下不受支持吗?我有一种模糊的感觉,它与硬链接和索引节点有关,但我希望有一个好的解释。
Unix 文件系统使用引用计数和两层架构来查找文件。
文件名指的是一个叫做inode https://secure.wikimedia.org/wikipedia/en/wiki/Inode,对于信息节点或索引节点。索引节点存储(指向)文件内容以及一些元数据,例如文件的类型(普通、目录、设备等)以及谁拥有它。
多个文件名可以引用同一个 inode;然后他们被称为硬链接 https://secure.wikimedia.org/wikipedia/en/wiki/Hard_link。此外,还有一个文件描述符 https://secure.wikimedia.org/wikipedia/en/wiki/File_descriptor(fd) 指的是索引节点。 fd 是进程打开文件时获取的对象类型。
Unix 文件系统中的文件只有在最后一个引用消失时才会消失,即不再有名称(硬链接)或 fd 引用它时。所以,rm
实际上并没有删除文件;它删除了一个参考 a file.
这种文件系统设置可能看起来很混乱,有时会带来问题(尤其是 NFS),但它的优点是对于许多应用程序来说不需要锁定。许多 Unix 程序也利用这种情况,打开一个临时文件,然后立即将其删除。一旦它们终止,即使它们崩溃,临时文件也会消失。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)