Das Beispiel, das ich habe, ist Minecraft. Wenn ich Bukkit unter Linux ausführe, kann ich die .jar-Dateien im Ordner /plugins entfernen oder aktualisieren und einfach den Befehl „reload“ ausführen.
Unter Windows muss ich den gesamten Serverprozess herunterfahren, da er sich darüber beschwert, dass die .jar-Datei derzeit verwendet wird, wenn ich versuche, sie zu entfernen oder zu ersetzen.
Das finde ich großartig, aber warum passiert das?
Was macht Linux hier anders?
Akzeptierte Antwort:
Linux löscht eine Datei ganz anders als Windows. Zunächst eine kurze Erklärung, wie Dateien in den *nativen Unix-Dateisystemen verwaltet werden.
Die Datei wird auf der Festplatte in der mehrstufigen Struktur namens i-node
gehalten . Jeder I-Node hat eine eindeutige Nummer auf dem einzelnen Dateisystem. Die I-Node-Struktur speichert verschiedene Informationen über eine Datei, wie z. B. ihre Größe, der Datei zugewiesene Datenblöcke usw., aber für diese Antwort ist das wichtigste Datenelement ein link counter
. Die directories
sind die Dateien, die Aufzeichnungen über die Dateien führen. Jeder Datensatz hat die I-Node-Nummer, auf die er sich bezieht, die Länge des Dateinamens und den Dateinamen selbst. Dieses Schema ermöglicht es, „Zeiger“, d. h. „Links“, auf dieselbe Datei an verschiedenen Stellen mit unterschiedlichen Namen zu haben. Der Linkzähler des I-Node hält tatsächlich die Anzahl der Links, die auf diesen I-Node verweisen.
Was passiert, wenn ein Prozess die Datei öffnet? Zuerst das open()
Funktion sucht nach dem Dateidatensatz. Dann prüft er, ob die In-Memory-In-Node-Struktur für diesen In-Node bereits existiert. Dies kann passieren, wenn eine Anwendung diese Datei bereits geöffnet hatte. Andernfalls initialisiert das System eine neue In-Memory-I-Node-Struktur. Dann erhöht das System den Öffnungszähler der I-Node-Struktur im Speicher und gibt seinen Dateideskriptor an die Anwendung zurück.
Der Linux-Bibliotheksaufruf zum Löschen einer Datei heißt unlink
. Diese Funktion entfernt den Dateidatensatz aus einem Verzeichnis und verringert den Verbindungszähler des i-Node. Wenn das System feststellt, dass eine speicherinterne I-Node-Struktur existiert und ihr Öffnungszähler nicht null ist, gibt dieser Aufruf die Steuerung an die Anwendung zurück. Andernfalls prüft es, ob der Verbindungszähler Null geworden ist, und wenn dies der Fall ist, gibt das System alle Blöcke frei, die dem i-Knoten und dem i-Knoten selbst zugewiesen sind, und kehrt zur Anwendung zurück.
Was passiert, wenn eine Anwendung eine Datei schließt? Die Funktion close()
dekrementiert den Öffnungszähler und prüft seinen Wert. Wenn der Wert nicht Null ist, kehrt die Funktion zur Anwendung zurück. Andernfalls prüft es, ob der I-Node-Verbindungszähler Null ist. Wenn es Null ist, gibt es alle Blöcke der Datei und des I-Nodes frei, bevor es zur Anwendung zurückkehrt.
Mit diesem Mechanismus können Sie eine Datei „löschen“, während sie geöffnet ist. Gleichzeitig hat die Anwendung, die eine Datei geöffnet hat, weiterhin Zugriff auf die Daten in der Datei. In Ihrem Beispiel lässt JRE also seine Dateiversion geöffnet, während sich eine andere, aktualisierte Version auf der Festplatte befindet.
Verwandte:Eine ODBK-Datei und wie kann man sie wiederherstellen?Darüber hinaus können Sie mit dieser Funktion die glibc(libc) – die Kernbibliothek aller Anwendungen – in Ihrem System aktualisieren, ohne den normalen Betrieb zu unterbrechen.
Windows
Vor 20 Jahren kannten wir kein anderes Dateisystem als FAT unter DOS. Dieses Dateisystem hat eine andere Struktur und andere Verwaltungsprinzipien. Diese Prinzipien erlauben es Ihnen nicht, eine Datei zu löschen, wenn sie geöffnet ist, daher müssen DOS und neuerdings auch Windows alle Löschanforderungen für eine geöffnete Datei ablehnen. Wahrscheinlich würde NTFS dasselbe Verhalten wie *nix-Dateisysteme zulassen, aber Microsoft hat sich entschieden, das gewohnte Verhalten der Dateilöschung beizubehalten.
Das ist die Antwort. Nicht kurz, aber jetzt hast du die Idee.
Bearbeiten :
Eine gute Lektüre zu den Quellen von Win32
Durcheinander:https://blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 Credits an @Jon