
Wenn Softlink und Hardlink Zeiger auf eine Datei sind.
Und ein Dateideskriptor ist ein Dateihandle, der auf eine geöffnete Datei verweist.
Was ist dann der genaue Unterschied zwischen den beiden, wenn beide eine Art Zeiger auf eine Datei sind?
Außerdem zeigen Hardlinks auf die Adressposition von Dateiinhalten und Dateideskriptoren zeigen ebenfalls auf Dateiinhalte. Was ist hier also genau der Unterschied? Außerdem haben Hardlinks eigene Dateideskriptoren.
Antwort1
Philosophisch gesehen könnte man argumentieren, dass sie sich nicht unterscheiden.
Aber sie unterscheiden sich völlig darin, warum, wo und wie sie eingesetzt und implementiert werden.
Erstens sind sowohl Hardlinks als auch Softlinks/symbolische Links Verzeichniseinträge, d. h. es handelt sich um Einträge/Datensätze in einer speziell formatierten Datei namens Verzeichnis, wobei jeder Datensatz einen Namen und eine Inode-Nummer enthält – letztere bezieht sich auf die tatsächliche Struktur, die die Metadaten der Datei (Berechtigungen, Größe usw.) und die Liste der Datenblöcke enthält – eine Struktur, die als „Inode“ bezeichnet wird.
Der Unterschied zwischen einem Hardlink und einem symbolischen Link besteht darin, dass der Inode, auf den ein Hardlink verweist, die eigentlichen Daten enthält, während der Inode, auf den ein symbolischer Link verweist, den Pfad zu einer anderen Datei enthält. Grundsätzlich sind Symlinks selbsthartLinks, die auf einen speziellen Dateityp verweisen, genau wie benannte Pipes, Unix-Domain-Socket-Dateien usw.
Wenn der Kernel nun eine Datei öffnet, erstellt er eine Struktur im Arbeitsspeicher, die den Inode der Festplatte dupliziert und einige der gleichen Metadaten enthält (Berechtigungen, Liste der Blöcke mit Daten, Größe usw.). Auf diese Struktur verweist eine andere Struktur namens „Open File Description“ (die Dinge wie den Positionszeiger enthält, ob die Datei im Lese-/Schreibmodus oder im Nur-Lese-Modus geöffnet wurde, ob sie im nicht blockierenden Modus gelesen und geschrieben werden soll usw.). Schließlich verweist auf diese Struktur ein Eintrag in einer anderen Kernel-Struktur (pro Prozess), einem Array/einer Tabelle namens Dateideskriptortabelle.
Der „Dateideskriptor“, die von Systemaufrufen wie open(2) zurückgegebene Ganzzahl, ist ein Index in dieser Tabelle.
Auf einen Inode im Arbeitsspeicher können mehrere „offene Dateibeschreibungen“ verweisen, auf den wiederum mehrere Dateideskriptoren aus mehreren Prozessen verweisen können.
Einige der Systemaufrufe wie open(2) behandeln symbolische Links speziell – wenn sich die von ihnen geöffnete Datei als symbolischer Link herausstellt, versuchen sie weiterhin, die Datei mit dem Pfad zu öffnen, der ihren Inhalt darstellt.
Sowohl die Festplattenstrukturen (Verzeichnisse, Inodes) als auch die Kernel-/Speicherstrukturen (Inodes, offene Dateibeschreibungen) verwenden Referenzzählungen, um den Überblick darüber zu behalten, wer was verwendet. (Nein, es gibt im Kernel keinen Mark & Sweep-Garbage Collector, der durch Zeiger im Speicher oder auf der Festplatte springt, um festzustellen, auf welche Objekte von nirgendwo anders mehr verwiesen wird ;-)).