Ich habe zwei Muscheln offen. Das erste befindet sich in Verzeichnis A. Im zweiten entferne ich Verzeichnis A und erstelle es dann neu. Wenn ich zur ersten Shell zurückkehre und tippe ls
, ist die Ausgabe:
ls: cannot open directory .: Stale file handle
Warum? Ich dachte, die erste Shell (die in einem nicht existierenden Verzeichnis geöffnet blieb) würde "einfrieren", während sie auf den nächsten Befehl wartet, und hätte nicht "bemerkt", dass das Verzeichnis gelöscht und neu erstellt wurde. Enthält die Shell einen "tieferen" Verweis auf ihr aktuelles Arbeitsverzeichnis als die Zeichenfolge $PWD
?
bash
filesystems
open-files
pwd
Fonini
quelle
quelle
cd $PWD
.Antworten:
Ein Verzeichnis (wie jede Datei) wird nicht durch seinen Namen definiert. Stellen Sie sich den Namen als Adresse des Verzeichnisses vor . Wenn Sie das Verzeichnis verschieben, ist es immer noch dasselbe Verzeichnis, genau wie wenn Sie in ein anderes Haus umziehen, sind Sie immer noch dieselbe Person. Wenn Sie ein Verzeichnis entfernen und ein neues mit demselben Namen erstellen, ist es ein neues Verzeichnis, genau wie jemand, der in das Haus zieht, in dem Sie früher gewohnt haben, nicht wahr?
Jeder Prozess hat ein Arbeitsverzeichnis . Der
cd
Befehl in der Shell ändert das aktuelle Arbeitsverzeichnis der Shell. Derpwd
Befehl gibt den Pfad zum aktuellen Arbeitsverzeichnis aus.Als Sie das Verzeichnis A entfernt haben, wurde der Eintrag für A im übergeordneten Verzeichnis entfernt. Das Verzeichnis A selbst blieb im Dateisystem, jedoch ohne Namen. Es wurde noch nicht gelöscht, da es von einem Prozess verwendet wurde, nämlich der ersten Shell. Als Sie das Verzeichnis in der ersten Shell geändert haben, wurde das Verzeichnis endgültig gelöscht. Dasselbe passiert, wenn eine Datei gelöscht wird, während ein Prozess sie noch geöffnet hat: Der Verzeichniseintrag der Datei wird sofort entfernt, und die Datei selbst wird entfernt, wenn sie nicht mehr verwendet wird.
Beobachten Sie auch, was passiert, wenn Sie Verzeichnisse verschieben.
In einer anderen Shell:
In der ersten Schale:
Die Datei
1
befindet sich in dem Verzeichnis, das ursprünglich aufgerufen wurde,one
und wird jetzt aufgerufentwo
. Die Datei2
befindet sich in dem Verzeichnis, das ursprünglich aufgerufen wurde,two
und wird jetzt aufgerufenone
.¹ Genauer gesagt, ein Pfad, der möglicherweise nicht eindeutig ist, wenn symbolische Verknüpfungen oder andere Feinheiten beteiligt sind.
quelle
/proc/<pid>/cwd
, was so funktioniert/proc/<pid>/fd/<number>
. Es istCWD
in der Ausgabe vonlsof
.cd - && cd -
in einem solchen Fall automatisch zu machen ?Das neue Verzeichnis A ist nicht dasselbe wie das Verzeichnis A. Es kann
stat
vor dem Löschen des alten und nach dem Erstellen des neuen Verzeichnisses mit dem Befehl überprüft werden, und es werden verschiedene i-Node-Nummern angezeigt.Und ich denke, das hängt damit zusammen, wie der Kernel funktioniert. Es verfolgt einfach die i-Nummer des aktuellen Verzeichnisses für jeden Prozess. Da es also unterschiedliche i-Nummern gibt, führt dies zu unterschiedlichen Kollisionen.
quelle
Dies ist das erwartete Verhalten. Das neue Verzeichnis A ist nicht dasselbe wie das alte Verzeichnis A, es hat einfach den gleichen Namen. Die $ PWD des ersten Terminals ist also immer noch weg, sie ist nicht auf magische Weise wieder aufgetaucht, als Sie das getan haben
mkdir A
.quelle
Einem Verzeichnis ist wie einer Datei ein Inode zugeordnet:
307% mkdir ABC
308% ls -i 11997708 A 11997709 B 11997710 C
Ein Inode ist eine Datenstruktur, die Informationen über das Verzeichnis oder die Datei enthält. Jedes Verzeichnis und jede Datei hat eines. Stellen Sie es sich als Adresse vor (eine Indexnummer wirklich).
Wenn ich mich in A befinde , Inode-Nummer 11997708 und in einer anderen Shell (oder in derselben Shell, in der ich mich gerade befinde ), lösche Verzeichnis A, erstelle es neu und ls die Inode:
309% CD A
310% rmdir ../A
311% mkdir ../A
312% ls -i ..
11997720 A 11997709 B 11997710 C
Der i-Knoten ist anders. Wenn also versucht wird, eine Datei im gelöschten Verzeichnis A zu erstellen, gilt Folgendes:
313% berühren dies
touch: kann 'this' nicht berühren: Keine solche Datei oder kein solches Verzeichnis
da das Verzeichnis, in dem ich mich befinde, nicht mehr mit dem Inode 11997720 verknüpft ist, hat mein aktueller Standort also keine legitime Adresse / Index - Inode. Also der Fehler.
quelle