Warum kann ich erfolgreich eine Datei in Linux verschieben, während es geschrieben wird?

Diese Frage, die ich denke, ist technisch genug für S / O, und wahrscheinlich auch Programmier-orientiert für Android . Ich bin fasziniert, wie Dateien in Android (oder Java oder Linux, wie angemessen) behandelt werden, da habe ich etwas mit meinem neuen Smartphone und ich wäre neugierig zu wissen, wie es passiert ist.

Ich habe eine Datei von meinem Laptop auf mein Android-Handy über Bluetooth übertragen. Ich sah die neue Datei im Datei-Explorer, nahm an, dass es vollständig übertragen wurde, und so verschoben von /sdcard/bluetooth zu /sdcard/torrents . Nachdem ich das getan hatte, bemerkte ich, dass es tatsächlich noch übertragen wurde. Zu meiner Überraschung wurde es erfolgreich abgeschlossen, mit einem Benachrichtigungssymbol im Telefon bestätigt und mit einem manuellen MD5-Check auf beiden Seiten. In den meisten Systemen hätte die Datei verschoben einen Crash verursacht.

Was ist der Grund für diesen erfolgreichen Transfer? Ich bin mir bewusst, dass der Dateipfad im Allgemeinen vom Dateispeicherort des Dateisystems (in diesem Fall einer SD-Karte) getrennt ist. Ich stelle mir vor, dass die Bluetooth App einen Griff für die Datei geöffnet hat und als ich die Datei verschoben hatte, wurde eine Tabelle mit 'offenen Dateien' mit einem neuen Pfad aktualisiert. Ist diese Funktion im Allgemeinen für jedes Linux-System zutreffend? Könnte ich ein mv auf eine Datei schreiben und erwarten, dass die Kopie – an ihrem neuen Standort – richtig ist?

  • Wie kann das Debugging für Kindle Fire auf einem Linux (Ubuntu) aktiviert werden?
  • Multi-Touch-Cross-Plattform Java-Anwendung (Windows, Mac und Linux (Ubuntu) (möglicherweise Android))
  • PhoneGap - Building phonegap android app gibt kompilieren Fehler auf Linux
  • Ubuntu - Fehler: Fehler beim Erstellen der SD-Karte
  • Wie kann ich eine kompilierte Binärdatei in Android ausführen?
  • Adb zeigt nicht nexus 5 Gerät
  • Gibt es eine Android PCI Karte?
  • Fehler beim Erstellen von Build Tools Revision 21.1.1 - sdk up to date
  • One Solution collect form web for “Warum kann ich erfolgreich eine Datei in Linux verschieben, während es geschrieben wird?”

    Wenn du eine Datei innerhalb des gleichen Dateisystems verschiebst , wird die Datei selbst (der Inode ) überhaupt nicht verschoben. Das einzige, was sich ändert, sind die Verzeichniseinträge in diesem Dateisystem. (Der von mv in diesem Fall aufgerufene Systemaufruf ist rename(2) – diese Seite auf weitere Informationen und Einschränkungen prüfen.)

    Wenn ein Prozess eine Datei öffnet, wird der Dateiname an das Betriebssystem übergeben, um anzugeben, welche Datei gemeint ist, aber der Dateideskriptor, den du zurückgibst, ist nicht mit diesem Namen verknüpft (man bekommt keinen Dateinamen davon) es ist mit dem inode verbunden.
    Da der Inode unverändert bleibt, wenn Sie eine Datei umbenennen (im selben Dateisystem), können Prozesse, die es offen haben, gerne lesen und schreiben – nichts hat sich für sie geändert, ihr Dateideskriptor ist immer noch gültig und zeigt auf die richtigen Daten.

    Gleiche Sache, wenn Sie eine Datei löschen. Prozesse können lesen und schreiben von ihm, auch wenn die Datei nicht mehr erreichbar ist durch einen beliebigen Verzeichniseintrag. (Dies kann zu verwirrenden Situationen führen, in denen df berichtet, dass dein Datenträger voll ist, aber du sagt, du benutzt viel weniger Platz, den df berichtet. Die Bausteine, die gelöschten Dateien zugeordnet sind, die noch offen sind, werden nicht freigegeben, bis diese Prozesse sie schließen Dateideskriptor.)

    Wenn das mv die Datei über Dateisysteme verschiebt, dann ist das Verhalten anders, da die Inodes für jedes Dateisystem spezifisch sind. In diesem Fall wird mv tatsächlich die Daten kopieren und einen neuen Inode (und Verzeichniseintrag) auf dem Ziel-Dateisystem erstellen. Wenn die Kopie vorbei ist, wird die alte Datei nicht verknüpft und entfernt, wenn es keine offenen Dateihandles gibt, wie oben.
    In deinem Fall, wenn du eine Dateisystemgrenze überschritten hättest, hättest du eine Teildatei im Ziel. Und Ihr Upload-Prozess glücklich Schreiben in eine gelöschte Datei, die Sie nicht leicht zugreifen können, möglicherweise füllen, dass Dateisystem, bis der Upload beendet, an welchem ​​Punkt der Inode würde fallen gelassen werden.

    Einige Beiträge auf Unix & Linux , die Sie interessant finden könnten:

    • Wie werden Verzeichnisse in Unix-Dateisystemen implementiert?
    • Was ist ein Superblock, Inode, Dentry und eine Datei?
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.