Angenommen, ich habe ein Terminal geöffnet und bin über dieses Terminal cd
in ein Verzeichnis gegangen. Über ein anderes Terminal lösche ich dieses Verzeichnis und stelle es aus einer identischen Sicherung wieder her. vim
Warum 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)
.)
100
touch
auf Host A, um ihn normal zu machen.Antworten:
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 handle
Nachricht, weil Sie nach nicht vorhandenen Daten gefragt haben.Wenn Sie eine
cd
Operation 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.quelle