Linux 有什麼不同之處,允許我刪除/替換 Windows 會抱怨文件目前正在使用的文件?
我的例子是 Minecraft。在 Linux 上執行 Bukkit 時,我可以刪除或更新 /plugins 文件夾中的 .jar 文件,然後只需執行“重新載入”命令。
在 Windows 中,我必須關閉整個伺服器程序,因為當我嘗試刪除或替換 .jar 文件時,它會抱怨目前正在使用它。
這對我來說很棒,但為什麼會發生呢?Linux在這裡有什麼不同?
Linux 刪除文件的方式與 Windows 完全不同。首先,簡要說明如何在 *unix 本機文件系統中管理文件。
該文件以稱為
i-node
. 每個索引節點在單個文件系統上都有一個唯一編號。i-node 結構保存有關文件的不同資訊,例如文件大小、為文件分配的數據塊等,但為了這個答案,最重要的數據元素是link counter
. 這些directories
是保存有關文件的記錄的文件。每條記錄都有它所引用的索引節點號、文件名長度和文件名本身。這種方案允許擁有“指針”,即“連結”到不同位置的同一個文件,但名稱不同。i-node 的連結計數器實際上保存了引用此 i-node 的連結數。當某個程序打開文件時會發生什麼?首先該
open()
函式搜尋文件記錄。然後它檢查這個 i-node 的記憶體中 i-node 結構是否已經存在。如果某些應用程序已經打開了此文件,則可能會發生這種情況。否則,系統將初始化一個新的記憶體 i 節點結構。然後系統增加記憶體中的 i-node 結構打開計數器並將其文件描述符返回給應用程序。用於刪除文件的 Linux 庫呼叫稱為
unlink
. 此函式從目錄中刪除文件記錄並減少 i-node 的連結計數器。如果系統發現記憶體中的 i-node 結構存在並且其打開計數器不為零,則此呼叫將控制權返回給應用程序。否則,它檢查連結計數器是否變為零,如果是,則係統釋放為 i 節點和 i 節點本身分配的所有塊並返回到應用程序。應用程序關閉文件會發生什麼?該函式
close()
遞減打開的計數器並檢查其值。如果該值非零,則函式返回到應用程序。否則,它檢查 i-node 連結計數器是否為零。如果為零,則在返回應用程序之前釋放文件的所有塊和 i 節點。此機制允許您在打開文件時“刪除”文件。同時,打開文件的應用程序仍然可以訪問文件中的數據。因此,在您的範例中,JRE 仍然保持其文件版本處於打開狀態,而磁碟上有另一個更新版本。
此外,此功能允許您更新系統中的 glibc(libc) - 所有應用程序的核心庫 - 而不會中斷其正常執行。
視窗
20 年前,我們不知道 DOS 下除了 FAT 之外的任何其他文件系統。這個文件系統有不同的結構和管理原則。這些原則不允許您在打開文件時刪除文件,因此 DOS 和最近的 Windows 必須拒絕對打開的文件的任何刪除請求。NTFS 可能會允許與 *nix 文件系統相同的行為,但 Microsoft 決定保持文件刪除的習慣行為。
這就是答案。不短,但現在你有想法了。
編輯:關於
Win32
混亂來源的好書:https ://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p= 38993 致@Jon