Antworten:
Der Grund dafür ist, dass Unix eine ausführbare Datei nicht sperrt, während sie ausgeführt wird, oder auch wenn es Linux mag, gilt diese Sperre für den Inode und nicht für den Dateinamen. Das bedeutet, dass ein Prozess, der es offen hält, auf dieselben (alten) Daten zugreift, auch nachdem die Datei gelöscht (tatsächlich nicht verknüpft) und durch eine neue mit demselben Namen ersetzt wurde, was im Wesentlichen bei einem Paket-Update der Fall ist.
Das ist einer der Hauptunterschiede zwischen Unix und Windows. Letzteres kann eine gesperrte Datei nicht aktualisieren, da eine Ebene zwischen Dateinamen und Inodes fehlt, was die Aktualisierung oder Installation einiger Pakete erheblich erschwert, da normalerweise ein vollständiger Neustart erforderlich ist.
Ausführbare Dateien werden in der Regel einmal geöffnet, an einen Dateideskriptor angehängt und haben keinen Dateideskriptor für ihre Binärdatei, der während eines einzelnen Ausführungszeitraums erneut geöffnet wird. Wenn Sie beispielsweise ausführen bash
, wird im exec()
Allgemeinen nur ein Dateideskriptor für den Inode erstellt, auf den /bin/bash
beim Aufruf einmalig verwiesen wird .
Dies bedeutet häufig, dass für einfache Binärdateien, die während der Ausführung nicht versuchen, sich selbst neu zu lesen (indem sie den Pfad verwenden, über den sie aufgerufen wurden), der zwischengespeicherte Inhalt als baumelnder Inode gültig bleibt. Dies bedeutet, dass im Wesentlichen ein Replikat der vorherigen Version der ausführbaren Datei vorhanden ist.
In komplexeren Fällen kann dies zu Problemen führen. Beispielsweise kann eine Konfigurationsdatei aktualisiert und anschließend erneut gelesen werden, oder das Programm kann sich selbst über den Pfad, von dem aus es ausgeführt wurde, erneut ausführen. Es kann auch Probleme geben, wenn Programme miteinander verbunden sind und eines vor dem Upgrade und eines danach (möglicherweise vom ersten Programm) ausgeführt wird. Dies gilt auch für einige Bibliotheken.
Für einfache Anwendungsfälle ist es jedoch sicher, ein Upgrade durchzuführen, ohne den Prozess neu zu starten.
bash
Binärdateien ungefähr 200 4K-Seiten, nicht sicher, ob sie alle in einer durchschnittlichen Sitzung verwendet werden.
ialloc()
, beim Lesen eine Kernel-Struktur zu verwenden, nicht die Speicherzuordnung der Seiten selbst. Habe ich nicht Recht, wenn ich denke, dass der Inode auf modernen ext * -Dateisystemen irgendwann im Kernel (und innerhalb des VM-Subsystems) konsistent ist?