GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Linux macht es anders, was es mir ermöglicht, Dateien zu entfernen/ersetzen, bei denen Windows sich darüber beschweren würde, dass die Datei derzeit verwendet wird?

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


Linux
  1. Kopieren Sie Dateien im Linux-Terminal

  2. Verschieben Sie Dateien im Linux-Terminal

  3. So verwenden Sie den Tar-Befehl unter Linux

  4. So verwenden Sie Netcat zum Übertragen von Dateien unter Linux

  5. Linux:Wo soll die Auslagerungsdatei abgelegt werden

So verwenden Sie den Linux-diff-Befehl

So verwenden Sie den Linux-Befehl ftp zum Hoch- und Herunterladen von Dateien auf der Shell

Die 6 besten Möglichkeiten zum Anzeigen von Dateien unter Linux

Sysadmin-Tools:11 Möglichkeiten, den Befehl ls unter Linux zu verwenden

Wie verwende ich den Gzip-Befehl unter Linux?

Wo ist die php.ini-Datei auf einem Linux/CentOS-PC?