Wenn eine Datei verschoben wird und die Zieldatei bereits vorhanden ist und gerade gelesen wird, ist der Vorgang erfolgreich? Wird es davon abhängen, wie lange der Lesevorgang für die Zieldatei dauert?
quelle
Wenn eine Datei verschoben wird und die Zieldatei bereits vorhanden ist und gerade gelesen wird, ist der Vorgang erfolgreich? Wird es davon abhängen, wie lange der Lesevorgang für die Zieldatei dauert?
Der Lesevorgang ist erfolgreich, unabhängig von der Zeit, die zum Abschließen des Lesevorgangs benötigt wird.
Warum und wie funktioniert das?
Wenn der Lesevorgang gestartet wird, wird der Inode der Datei als Handle verwendet, von dem der Inhalt der Datei gelesen wird.
Wenn Sie eine andere Datei in die Zieldatei verschieben, wird ein neuer Inode erstellt. Dies bedeutet, dass der physische Inhalt der Datei auf der Festplatte an einer anderen Stelle abgelegt wird und der ursprüngliche Inhalt der gelesenen Datei nicht berührt wird.
Das einzige, was sie gemeinsam haben, ist ihr Pfad / Dateiname, während sich der zugrunde liegende Inode- und Phyiscal-Speicherort auf der Festplatte ändert.
Sobald der Lesevorgang abgeschlossen ist (vorausgesetzt, kein anderer Prozess hat noch ein offenes Dateihandle für die alte Datei und es gibt keine anderen Hardlinks, die auf ihren Inode verweisen), werden die alten Daten verworfen.
Sobald der Verschiebevorgang abgeschlossen ist, hat die Datei eine neue Inode-Indexnummer.
Sie können die Inode-Indexnummer der Dateien mit anzeigen ls -i /tmp/some-file
.
Aus dem gleichen Grund wie oben beschrieben ist es möglich, Dateien zu löschen, die noch von einer Anwendung verwendet werden, da die Anwendungen, die die Datei verwenden, nur aus dem Inode lesen (auf den tatsächlichen Dateiinhalt auf der Festplatte verweisen), während die Dateien referenzieren im Dateisystem wird gelöscht.