Verschieben einer Datei während der Verwendung - Wie funktioniert es?

31

Mir ist aufgefallen, dass ich unter Nicht-Windows-Betriebssystemen (z. B. Linux / Mac) Folgendes tun kann: - Einem Freund eine Zip-Datei senden - Die Datei löschen, während sie übertragen wird

Und die Übertragung schlägt nicht fehl.

Oder ich kann folgende Operationen ausführen: - Einen Film starten - Die Datei löschen - Der Film wird noch vollständig abgespielt (von der Festplatte lesen, nicht nur im Speicher zwischengespeichert).

Obwohl die Dateien "gelöscht" werden, wie ich bereits sagte, werden sie tatsächlich an einen anderen Ort im Dateisystem verschoben ... zB in ein Papierkorbverzeichnis oder so. Mir scheint, dass das Betriebssystem einen Zeiger @ auf die Datei verwendet, die beim Verschieben aktualisiert wird, anstatt direkt auf die Dateien zuzugreifen.

Kann jemand etwas Licht ins Dunkel bringen, wie diese AWESOME-Funktion tatsächlich implementiert wird? Ich bin mir nicht mal sicher, was ich googeln soll, um mehr darüber zu erfahren.

Danke dir.

Mario Zigliotto
quelle
1
Theoretisch gibt es zwei Möglichkeiten, wie das passieren könnte. Beides ist Realität. Die Datei befindet sich im Speicher. Oder das Dateisystem enthält Verweise auf die Dateien und nur der Verweis wird gelöscht. Beides ist Realität. Die Referenztatsache ist, wie nicht gelöschte Programme Dinge wiederherstellen können. Die Idee, dass die Datei tatsächlich gelöscht wird, wenn alle darauf zugreifenden Programme geschlossen werden, klingt nach Unsinn. Sie können nach verknüpften Listen suchen (eine Programmierdatenstruktur, um das Konzept genauer zu verstehen). Oder Sie könnten nach bestimmten Dateisystemen suchen.
Barlop

Antworten:

29

Der Verzeichniseintrag ist nur ein Zeiger auf eine Inode. Der Inode enthält die Metainformationen über die Datei (außer dem Namen) und zeigt auf die Daten der Datei (falls vorhanden). Wenn Sie mit dem Kopieren einer Datei beginnen, erhalten Sie ein Handle für den Inode.

Das Betriebssystem verwaltet eine Anzahl von Verweisen auf den Inode. Solange es Verweise auf den Inode gibt, bleiben der Inode und die Daten der Datei erhalten. Sobald alle Verweise auf den Inode entfernt wurden, ist der Inode und der für die Datei erforderliche Speicherplatz wird freigegeben.

Da Sie die Datei zum Kopieren geöffnet haben, wird sie beibehalten, bis der Prozess die Datei schließt. Dies sollte auftreten, wenn die Dateiübertragung abgeschlossen ist und wenn der Kopiervorgang fehlschlägt. Wenn die Dateiübertragung nach einem kurzen Zeitraum fehlschlägt und Sie alle festen Links zu der Datei gelöscht haben, können Sie die Übertragung nicht erfolgreich neu starten.

BEARBEITEN: Wie bereits erwähnt, werden Dateien auf demselben Gerät verschoben, ohne dass die Daten verschoben werden. Stattdessen wird ein neuer Verzeichniseintrag im Zielverzeichnis erstellt und der ursprüngliche Verzeichniseintrag entfernt.

Es ist möglich, mehrere Verzeichniseinträge für dieselbe Datei zu haben. Diese werden als harte Links bezeichnet. Sie werden erstellt, indem ein neuer Verzeichniseintrag für die Datei erstellt wird, ohne den ursprünglichen Eintrag zu entfernen. Der Inode des Dateisystems verfügt über einen Referenzzähler, um die Anzahl der Verzeichniseinträge aufzuzeichnen, die auf die Datei verweisen.

EDIT2: Wenn der Prozess abstürzt oder beendet wird, wird die Datei sauber entfernt, da die Anzahl der Speicherzugriffe auf Null reduziert wird. Dies ist die Aktion, die ausgeführt wird, wenn das Programm normal beendet wird.

Im Falle eines Stromausfalls oder eines anderen ungeordneten Herunterfahrens des Systems muss die Festplatte fscküberprüft werden, bevor sie vollständig bereitgestellt werden kann. Abhängig vom Status des Inodes und der Verzeichnisstrukturen auf der Festplatte wird der Speicherplatz wiederhergestellt, die Datei verbleibt im Verzeichnis oder es wird ein neuer Eintrag im lost+foundVerzeichnis erstellt. Die Ergebnisse hängen davon ab, welche Änderungen auf die Festplatte geschrieben oder in das Dateisystemjournal geschrieben wurden.

BillThor
quelle
5
Genau. Ich könnte es nicht besser ausdrücken. Im Übrigen besteht ein häufiger Trick, wenn Sie in einem Programm einen Arbeitsspeicher benötigen, darin, eine Datei in /tmpund sofort unlink(2)darauf zu erstellen . Zu diesem Zeitpunkt befindet sich keine Datei in einem Verzeichnis (daher ist beim Beenden oder Absturz keine Bereinigung erforderlich). Ihr Prozess hat jedoch weiterhin Zugriff auf die Datei, und kein anderer Prozess kann versehentlich oder absichtlich mit ihr in Konflikt geraten. Das zeigt die Eigenschaft von Interesse.
Norman Gray
Bedeutet dies, dass wenn eine geöffnete Datei entfernt wird, während ein Programm sie verwendet, und ein Stromausfall auftritt, gestrandete Daten auf dem Laufwerk verbleiben und den Speicherplatz belegen? Was ist, wenn der Prozess mit der Datei abstürzt oder abgebrochen wird?
Jason C
1
@JasonC Ich habe die Antwort aktualisiert, um Ihre Fragen zu beantworten.
BillThor
6

Wie von Matt Jenkins erklärt, verfolgt das Betriebssystem (das Dateisystem) die Dateien, die von Anwendungen geöffnet bleiben. Solange ein Prozess eine Datei geöffnet hält, verbleiben ihre Daten auf der Festplatte (auch wenn sie gelöscht wurden und für andere Programme nicht mehr sichtbar oder zugänglich sind.

Dies hat zur Folge, dass der von einer Datei belegte Speicherplatz erst freigegeben werden kann, wenn der letzte Prozess, der sie verwendet, sie geschlossen hat. Dies ist eine FAQ für Linux / Unix-Dateisystemoperationen: "Der Befehl 'df' gibt an, dass die Partition voll ist, während 'du' freien Speicherplatz meldet" (siehe z. B. http://batleth.sapienti-sat.org/projects/FAQs/ext3-). faq.html ). Wenn Sie Speicherplatz freigeben müssen, reicht es nicht aus, große Dateien (z. B. Protokolldateien) zu löschen. Sie müssen auch sicherstellen, dass kein Prozess sie offen hält (normalerweise ein Problem mit Protokolldateien).

sleske
quelle
Nicht zutreffend bei OS X / HFS +: Sie können Dateien, z. B. in den Papierkorb, aber nicht über Partitionen hinweg verschieben oder löschen (dh den Papierkorb leeren).
Daniel Beck
2

Es ist eigentlich ganz einfach. Die Datei enthält eine Liste von Referenzen - Prozesse, die auf die Datei zugreifen. Wenn Sie die Datei löschen, wird lediglich die Liste aus dem Verzeichnis entfernt, nicht jedoch die Datei selbst. Die Programme, bei denen die Datei noch geöffnet ist, können weiterhin darauf zugreifen. Die Datei wird erst tatsächlich gelöscht, wenn alle darauf zugreifenden Programme sie schließen.

Außerdem wird beim Verschieben der Datei - wenn sie sich im selben Dateisystem befindet - die Datei nicht als solche verschoben, sondern lediglich der Zeiger auf das Verzeichnis geändert, in dem sich die Datei befindet.

Majenko
quelle
"Die Datei enthält eine Referenzliste"?
Daniel Beck
Sollte die "OS oder Explorer" -Datei nicht sein.
Moab,
2
Das wäre eigentlich das Dateisystem.
JRobert
Das Betriebssystem verwendet das Dateisystem, um die Referenzen in der Datei zu speichern (nlinks in der Datei-Header-Struktur) - dort - wir sind alle glücklich;)
Majenko
1
"Referenzen" sind sowohl Prozesse mit einem offenen Handle zur Datei als auch Hardlinks (einschließlich des ersten Dateinamens) zur Datei. Die Datenblöcke werden nicht als frei markiert und stehen zur Wiederverwendung zur Verfügung, bis der Referenzzähler auf Null geht.
Mpez0
0

In Unix-Dateisystemen kann eine Datei über eine oder mehrere feste Verknüpfungen verfügen . Die Datei lebt so lange, wie es mindestens eine gibt. Wenn der letzte entfernt wird, wird der Speicherplatz der Datei freigegeben. Link oben gibt Ihnen einen Ausgangspunkt für mehr Lesen - siehe insbesondere den Abschnitt "Linkzähler".

JRobert
quelle
1
Stimmt, aber genau das passiert hier nicht. Der Punkt ist, dass die Datei auch nach dem Entfernen des letzten Hardlinks so lange erhalten bleibt, bis alle Prozesse ihre Ziehpunkte für sie geschlossen haben.
sleske