Was bedeutet "veraltetes Dateihandle" unter Linux?

100

Angenommen, ich habe ein Terminal geöffnet und bin über dieses Terminal cdin ein Verzeichnis gegangen. Über ein anderes Terminal lösche ich dieses Verzeichnis und stelle es aus einer identischen Sicherung wieder her. vimWarum wird beim Versuch, eine Datei vom ersten Terminal im selben Verzeichnis abzurufen, eine Fehlermeldung bezüglich eines veralteten Dateihandles angezeigt? Was heißt das? (Nebenbei habe ich festgestellt, dass es möglich ist, dieses Problem zu umgehen cd $(pwd).)

IDDQD
quelle
Wenn Sie ein NFS-Verzeichnis (Name adir) von Host A zu Host B mounten und dann das Löschen und Wiederherstellen für adir auf Host A ausführen, können Sie auch den Fehler "Veraltetes Dateihandle" erhalten, wenn Sie auf adir auf Host zugreifen B. Verwenden Sie den Befehl touchauf Host A, um ihn normal zu machen.
Rustyhu

Antworten:

81

Wenn das Verzeichnis gelöscht wird, werden der Inode für dieses Verzeichnis (und die Inodes für seinen Inhalt) recycelt. Der Zeiger, den Ihre Shell auf den Inode dieses Verzeichnisses (und die Inodes seines Inhalts) hat, ist jetzt nicht mehr gültig. Wenn das Verzeichnis aus der Sicherung wiederhergestellt wird, werden die alten Inodes nicht (unbedingt) wiederverwendet. Das Verzeichnis und sein Inhalt werden auf zufälligen Inodes gespeichert. Das einzige, was gleich bleibt, ist, dass das übergeordnete Verzeichnis denselben Namen für das wiederhergestellte Verzeichnis wiederverwendet (weil Sie es angewiesen haben).

Wenn Sie nun versuchen, auf den Inhalt des Verzeichnisses zuzugreifen, auf das Ihre ursprüngliche Shell noch verweist, übermittelt sie diese Anforderung an das Dateisystem als Anforderung für den ursprünglichen Inode, der inzwischen recycelt wurde (und möglicherweise sogar für etwas verwendet wird) jetzt ganz anders). Sie erhalten also eine stale file handleNachricht, weil Sie nach nicht vorhandenen Daten gefragt haben.

Wenn Sie eine cdOperation ausführen , bewertet die Shell den Inode-Speicherort des von Ihnen angegebenen Ziels neu. Nachdem Ihre Shell den neuen Inode für das Verzeichnis (und die neuen Inodes für den Inhalt) kennt, sind zukünftige Anforderungen für den Inhalt gültig.

dg99
quelle
Ah, das ist also nur die Methode des Systems, ungültige / Null-Inode-Zeiger zu behandeln?
IDDQD
Ja. Ich weiß nicht genug über die Details, um zu wissen, was passieren würde, wenn Sie beispielsweise versuchen würden, auf eine Inode zu verweisen, die bereits recycelt wurde, um auf etwas anderes hinzuweisen. Würden Sie immer noch ein veraltetes Dateihandle bekommen? Oder würden Sie unerwartete Daten erhalten?
dg99
1
Ich glaube nicht, dass das System es wiederverwenden würde, da jemand diesen I-Knoten tatsächlich verwendet, indem er ihn als aktuelles Verzeichnis hat.
Samuel Åslund