Linux有何不同之处,使我可以在Windows抱怨当前正在使用文件的地方删除/替换文件?


29

我的例子是《我的世界》。在Linux上运行Bukkit时,我可以删除或更新/ plugins文件夹中的.jar文件,只需运行“ reload”命令。

在Windows中,我必须删除整个服务器进程,因为当我尝试删除或替换它时,它会抱怨说.jar文件正在使用中。

这对我来说很棒,但是为什么会发生呢?Linux在这里有什么不同?

Answers:


34

Linux删除文件的方式与Windows删除方式完全不同。首先,简要说明如何在* unix本机文件系统中管理文件。

文件以称为的多层结构保存在磁盘上i-node。每个索引节点在单个文件系统上都有一个唯一的编号。i节点结构保留有关文件的不同信息,例如文件的大小,为文件分配的数据块等,但是出于这个答案的考虑,最重要的数据元素是a link counter。的directories是保持对文件记录的文件。每个记录都有其引用的索引节点号,文件名长度和文件名本身。这种方案允许一个“指针”,即在不同位置以不同名称“链接”到同一文件。i节点的链接计数器实际上保留引用该i节点的链接数。

当某个进程打开文件时会发生什么?首先,该open()功能搜索文件记录。然后,它检查此i节点的内存中i节点结构是否已经存在。如果某些应用程序已经打开了此文件,则可能会发生这种情况。否则,系统将初始化新的内存中i节点结构。然后,系统增加内存中的i节点结构打开计数器,并将其文件描述符返回给应用程序。

删除文件的Linux库调用称为unlink。此功能从目录中删除文件记录,并减少索引节点的链接计数器。如果系统发现内存中的i节点结构存在并且其打开计数器不为零,则此调用将控制权返回给应用程序。否则,它检查链接计数器是否为零,如果确实为零,则系统释放为i节点分配的所有块以及i节点本身,然后返回到应用程序。

应用程序关闭文件会怎样?该函数close()减少打开计数器并检查其值。如果该值不为零,则该函数返回到应用程序。否则,它将检查i节点链接计数器是否为零。如果为零,则在返回到应用程序之前释放文件和i节点的所有块。

此机制允许您在打开文件时“删除”文件。同时,打开文件的应用程序仍然可以访问文件中的数据。因此,在您的示例中,JRE仍保持打开文件的版本,而磁盘上还有另一个更新的版本。

而且,此功能使您可以在不中断其正常操作的情况下更新系统中所有应用程序的核心库glibc(libc)。

视窗

20年前,除了DOS下的FAT,我们不知道任何其他文件系统。该文件系统具有不同的结构和管理原理。这些原则不允许您在打开文件时删除文件,因此DOS和最近的Windows必须拒绝对打开的文件的任何删除请求。NTFS可能允许与* nix文件系统相同的行为,但是Microsoft决定保留文件删除的惯常行为。

这就是答案。不短,但是现在您有了主意。

编辑:良好的阅读Win32混乱的源:https : //blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p = 38993致谢@Jon


1
在服务器运行时尝试重命名插件文件:i.imgur.com/xibyF.png
MetaGuru 2012年

打开cmd窗口,转到此目录并使用ren MonsterB.jar MonsterB.ja_-应该可以。它绝对适用于dll和exe文件。
Serge 2012年

1
不,Windows将可执行文件的某些部分映射到内存中
Serge

9
NTFS实际上确实支持它,但是C库fopen命令CreateFile使用该FILE_SHARE_DELETE标志调用,因此它对于大多数打开文件的程序都不允许使用。
Random832

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.