Wenn die Datei verschoben (im selben Dateisystem) oder umbenannt wird, bleibt das Dateihandle offen und kann weiterhin zum Lesen und Schreiben der Datei verwendet werden.
Wenn die Datei gelöscht wird, bleibt das Dateihandle geöffnet und kann weiterhin verwendet werden (das ist nicht das, was manche Leute erwarten). Die Datei wird erst wirklich gelöscht, wenn das letzte Handle geschlossen ist.
Wenn die Datei durch eine neue Datei ersetzt wird, hängt es genau davon ab, wie. Wenn der Inhalt der Datei überschrieben wird, ist das Datei-Handle weiterhin gültig und greift auf den neuen Inhalt zu. Wenn die Verknüpfung der bestehenden Datei aufgehoben und eine neue Datei mit demselben Namen erstellt wird oder wenn eine neue Datei mit rename()
auf die vorhandene Datei verschoben wird , es ist dasselbe wie Löschen (siehe oben) - das heißt, das Datei-Handle verweist weiterhin auf das Original Version der Datei.
Im Allgemeinen ist die Datei geöffnet, sobald sie geöffnet ist, und niemand, der die Verzeichnisstruktur ändert, kann dies ändern - sie können die Datei verschieben, umbenennen oder etwas anderes an ihre Stelle setzen, sie bleibt einfach geöffnet.
In Unix gibt es kein Löschen, nur unlink()
, was Sinn macht, da es nicht unbedingt die Datei löscht, sondern nur den Link aus dem Verzeichnis entfernt.
Wenn andererseits das zugrunde liegende Gerät verschwindet (z. B. USB-Stecker), ist das Datei-Handle nicht mehr gültig und gibt wahrscheinlich bei jeder Operation IO/Fehler aus. Du musst es aber noch schließen. Dies gilt auch dann, wenn das Gerät wieder angeschlossen wird, da es in diesem Fall nicht sinnvoll ist, eine Datei geöffnet zu lassen.
Dateihandles zeigen auf einen Inode, nicht auf einen Pfad, daher funktionieren die meisten Ihrer Szenarien immer noch so, wie Sie es annehmen, da das Handle immer noch auf die Datei zeigt.
Insbesondere beim Löschszenario - die Funktion heißt aus einem bestimmten Grund "Unlink", sie zerstört eine "Verknüpfung" zwischen einem Dateinamen (einem Dentry) und einer Datei. Wenn Sie eine Datei öffnen und dann die Verknüpfung aufheben, existiert die Datei tatsächlich noch, bis ihr Verweiszähler auf Null geht, was der Fall ist, wenn Sie das Handle schließen.
Bearbeiten: Im Fall von Hardware haben Sie ein Handle für einen bestimmten Geräteknoten geöffnet. Wenn Sie das Gerät ausstecken, schlägt der Kernel bei allen Zugriffen darauf fehl, selbst wenn das Gerät zurückkommt. Sie müssen das Gerät schließen und erneut öffnen.
Bei den anderen Vorgängen bin ich mir nicht sicher, aber was das Löschen betrifft:Das Löschen findet einfach nicht statt (physikalisch, dh im Dateisystem), bis das letzte offene Handle für die Datei geschlossen ist. Daher sollte es nicht möglich sein, eine Datei aus Ihrer Anwendung heraus zu löschen.
Einige Apps (die mir nicht in den Sinn kommen) verlassen sich auf dieses Verhalten, indem sie Dateien erstellen, öffnen und sofort löschen, die dann genauso lange leben wie die Anwendung – sodass andere Anwendungen den Lebenszyklus der ersten App kennen, ohne dies zu müssen schau dir Prozesskarten und so an.
Es ist möglich, dass ähnliche Überlegungen für die anderen Dinge gelten.