(Hmm: das folgende ist jetzt ein bisschen episch ...)
Das Design des Verzeichnisses auf Unix-Dateisystemen (die normalerweise, aber nicht unbedingt, mit Unix-Betriebssystemen verknüpft sind) bietet einen wunderbaren Einblick, der die Anzahl der erforderlichen Sonderfälle verringert.
Ein 'Verzeichnis' ist eigentlich nur eine Datei im Dateisystem. Der gesamte tatsächliche Inhalt der Dateien im Dateisystem befindet sich in Inodes (aus Ihrer Frage kann ich ersehen, dass Ihnen einige dieser Dinge bereits bekannt sind). Die Inodes auf der Festplatte sind nicht strukturiert - es handelt sich lediglich um eine große Menge nummerierter Bytes, die wie Erdnussbutter auf der Festplatte verteilt sind. Dies ist nicht sinnvoll und in der Tat abstoßend für alle, die etwas aufgeräumt sind.
Der einzige spezielle Inode ist Inode Nummer 2 (aus Traditionsgründen nicht 0 oder 1); Inode 2 ist eine Verzeichnisdatei: das Stammverzeichnis . Wenn das System das Dateisystem einbindet, "weiß" es, dass es das Verzeichnis inode 2 lesen muss, um sich selbst zu starten.
Eine Verzeichnisdatei ist nur eine Datei mit einer internen Struktur, die von opendir (3) und Freunden gelesen werden soll. Sie können die interne Struktur in dir (5) sehen (abhängig von Ihrem Betriebssystem). Wenn Sie sich das ansehen, werden Sie sehen, dass der Verzeichnisdateieintrag fast keine Informationen über die Datei enthält - das ist alles in der Datei inode. Eine der wenigen Besonderheiten dieser Datei ist, dass die open (2) -Funktion einen Fehler ausgibt, wenn Sie versuchen, eine Verzeichnisdatei in einem Modus zu öffnen, der das Schreiben zulässt. Verschiedene andere Befehle (um nur ein Beispiel zu nennen hexdump
) lehnen es ab, auf die normale Weise mit Verzeichnisdateien umzugehen, nur weil dies wahrscheinlich nicht das ist, was Sie tun möchten (aber das ist ihr Spezialfall, nicht der des Dateisystems).
Ein fester Link ist nichts anderes als ein Eintrag in der Map einer Verzeichnisdatei. Sie können zwei (oder mehr) Einträge in einer solchen Zuordnung haben, die beide derselben Inode-Nummer zugeordnet sind: Diese Inode hat daher zwei (oder mehr) feste Verknüpfungen. Dies erklärt auch, warum jede Datei mindestens einen "Hardlink" hat. Der Inode hat einen Referenzzähler, der aufzeichnet, wie oft dieser Inode in einer Verzeichnisdatei irgendwo im Dateisystem erwähnt wird (dies ist die Zahl, die Sie sehen, wenn Sie dies tun ls -l
).
OK: Wir kommen jetzt auf den Punkt.
Die Verzeichnisdatei ist eine Zuordnung von Zeichenfolgen ('Dateinamen') zu Zahlen (Inode-Nummern). Diese Inode-Nummern sind die Nummern der Inodes der Dateien, die sich in diesem Verzeichnis befinden. Die Dateien, die sich in diesem Verzeichnis befinden, können auch andere Verzeichnisdateien enthalten, sodass ihre Inode-Nummern zu den im Verzeichnis aufgelisteten gehören. Wenn Sie also eine Datei haben /tmp/foo/bar
, enthält die Verzeichnisdatei foo
einen Eintrag für bar
und ordnet diese Zeichenfolge dem Inode für diese Datei zu. Es gibt auch einen Eintrag in der Verzeichnisdatei /tmp
für die Verzeichnisdatei, foo
die sich im Verzeichnis befindet /tmp
.
Wenn Sie ein Verzeichnis mit mkdir (2) erstellen, funktioniert diese Funktion
- erstellt eine Verzeichnisdatei (mit einer Inode-Nummer) mit der korrekten internen Struktur,
- Fügt einen Eintrag zum übergeordneten Verzeichnis hinzu und ordnet den Namen des neuen Verzeichnisses diesem neuen Inode zu (der einen der Links berücksichtigt).
- Fügt dem neuen Verzeichnis einen Eintrag hinzu und ordnet die Zeichenfolge '.' zum selben Inode (dies ist der andere Link) und
- fügt dem neuen Verzeichnis einen weiteren Eintrag hinzu und ordnet die Zeichenfolge '..' dem Inode der in Schritt (2) geänderten Verzeichnisdatei zu (dies erklärt die größere Anzahl von Hardlinks, die Sie für Verzeichnisdateien mit Unterverzeichnissen sehen ).
Das Endergebnis ist, dass (fast) die einzigen Sonderfälle sind:
- Die open (2) -Funktion versucht es schwieriger zu machen, sich in den Fuß zu schießen, indem verhindert wird, dass Sie Verzeichnisdateien zum Schreiben öffnen.
- Die Funktion mkdir (2) vereinfacht die Arbeit, indem der neuen Verzeichnisdatei ein paar zusätzliche Einträge ('.' Und '..') hinzugefügt werden, um das Navigieren im Dateisystem zu vereinfachen. Ich vermute, dass das Dateisystem ohne '.' und "..", aber es wäre ein Schmerz zu benutzen.
- Die Verzeichnisdatei ist einer der wenigen Dateitypen, die als "speziell" gekennzeichnet sind - genau das weist Dinge wie open (2) an, sich etwas anders zu verhalten. Siehe
st_mode
in stat (2).
(kopiert von der ursprünglichen Frage zum Stapelüberlauf, 20.10.2011)
..
Hardlinks verfügen, muss Ihre Tree-Walking-Software bereits die Ausnahmen "Nicht den Zyklen der übergeordneten Verzeichnisverknüpfung folgen" aufweisen , sodass es nur wenig komplizierter ist, auch die.
Verknüpfung auszuschließen.