Un collegamento simbolico è un piccolo file che contiene la posizione (ad es. Percorso e nome file) di un file di destinazione, con un flag nella voce della directory che indica che si tratta di un collegamento simbolico.
Quando si apre un collegamento simbolico, il sistema operativo seguirà la posizione per trovare il file di destinazione. Se la destinazione è essa stessa un collegamento simbolico, segue anche la sua posizione (1) (2) fino a quando la posizione punta a un file che non è un collegamento simbolico (chiamiamolo FinalFile ). Quindi il sistema operativo ottiene l' inode di FinalFile (l'inode contiene metadati come tempo di modifica e ha anche un puntatore ai dati del file). Finalmente viene aperto l'inode di FinalFile . D'ora in poi il processo utilizza quell'inode per leggere / scrivere nel file. Di conseguenza modificando il nome o il percorso del collegamento simbolico, eliminando il collegamento simbolico, modificando il percorso o il nome del file finale o persino eliminando il file finale(3) non ha alcun effetto sul processo; sta ancora leggendo dallo stesso inode.
Nella maggior parte dei casi le operazioni sui file di dati sul collegamento simbolico influiranno sul file finale (ad esempio, la lettura e la scrittura sul collegamento simbolico leggerà / scriverà sul file finale ) ma ci sono eccezioni: la readlink()
chiamata di sistema legge il contenuto del collegamento simbolico stesso.
D'altra parte, le operazioni sui metadati dei file (come rinominare o eliminare) influiranno solitamente sul collegamento simbolico. Ma ci sono anche delle eccezioni: la lstat()
chiamata di sistema è simile stat()
, tranne per il fatto che restituisce informazioni sul link simbolico stesso piuttosto che su FinalFile (2).
(1) C'è un limite al numero di livelli e le cose diventano un po 'più complesse se la posizione nel collegamento simbolico è un percorso relativo.
(2) Leggi symlink (7): gestione simbolica del link per maggiori dettagli.man 7 symlink
(3) Il rm
comando o la unlink()
chiamata di sistema non rimuove fisicamente un file. Rimuove la voce della directory che punta all'inode del file. Il file stesso viene rimosso solo se entrambi a) non ci sono più voci di directory (hard link) che fanno riferimento al suo inode eb) nessun processo ha il file aperto.