Ein symbolischer Link ist eine kleine Datei, die den Speicherort (dh Pfad und Dateiname) einer Zieldatei enthält, wobei ein Flag im Verzeichniseintrag angibt, dass es sich um einen Symlink handelt.
Wenn Sie einen Symlink öffnen, folgt das Betriebssystem dem Speicherort, um die Zieldatei zu finden. Wenn das Ziel selbst ein Symlink ist, folgt es auch seinem Speicherort (1) (2), bis der Speicherort auf eine Datei verweist, die kein Symlink ist (nennen wir sie FinalFile ). Dann erhält das Betriebssystem den Inode der FinalFile (der Inode enthält Metadaten wie die Änderungszeit und hat auch einen Zeiger auf die Daten der Datei). Schließlich wird der Inode der FinalFile geöffnet. Von nun an verwendet der Prozess diesen Inode zum Lesen / Schreiben in die Datei. Infolgedessen ändern Sie den Symlink-Namen oder -Pfad, löschen den Symlink, ändern den Pfad oder den Namen der FinalFile oder löschen sogar die FinalFile(3) hat keine Auswirkung auf den Prozess; Es liest immer noch von derselben Inode.
In den meisten Fällen wirken sich Dateidatenoperationen auf dem Symlink auf die FinalFile aus (z. B. wird beim Lesen und Schreiben in den Symlink aus der FinalFile gelesen / in diese geschrieben ), es gibt jedoch Ausnahmen: Der readlink()
Systemaufruf liest den Inhalt des Symlinks selbst.
Dateimetadatenoperationen (wie Umbenennen oder Löschen) wirken sich normalerweise auf den Symlink aus. Aber auch hier gibt es Ausnahmen: Der lstat()
Systemaufruf ist wie folgt stat()
, außer dass er Informationen über den Symlink selbst und nicht über FinalFile (2) zurückgibt .
(1) Die Anzahl der Ebenen ist begrenzt, und die Dinge werden etwas komplexer, wenn die Position im Symlink ein relativer Pfad ist.
(2) Symlink lesen (7): Symbolische Linkbehandlung für weitere Details.man 7 symlink
(3) Der rm
Befehl oder der unlink()
Systemaufruf entfernt eine Datei nicht physisch. Es entfernt den Verzeichniseintrag, der auf den Inode der Datei verweist. Die Datei selbst wird nur entfernt, wenn sowohl a) keine Verzeichniseinträge (Hardlinks) mehr vorhanden sind, die auf ihren Inode verweisen, als auch b) kein Prozess die Datei geöffnet hat.