Il modo migliore per capire cosa ci sia alla base del concetto di collegamento è quello di fare un esempio. Creiamo perciò un file di tipo normale:
$ pwd /home/maria/example $ ls $ touch a $ ls -il a 32555 -rw-rw-r-- 1 maria maria 0 dic 10 08:12 a |
L'opzione -i del comando ls visualizza il numero di inode, che si trova nel primo campo dell'output. Come potete vedere, prima che noi creassimo il file a non esistevano altri file nella directory. L'altro campo che ci interessa è il terzo, quello che riporta il numero di collegamenti al file (in realtà sono collegamenti all'inodo).
L'azione del comando touch a può essere scomposta in due azioni separate:
la creazione di un inodo, al quale il sistema ha assegnato il numero 32555, e il cui tipo è quello di un file normale;
la creazione di un collegamento a tale inodo, il cui nome è a, all'interno della directory corrente, /home/maria/example. Il file /home/maria/example/a, pertanto, è un collegamento all'inodo numero 32555 e, al momento, è l'unico collegamento ad esso esistente: il contatore ne mostra infatti solo uno.
Ma adesso, se digitiamo:
$ ln a b $ ls -il a b 32555 -rw-rw-r-- 2 maria maria 0 dic 10 08:12 a 32555 -rw-rw-r-- 2 maria maria 0 dic 10 08:12 b $ |
abbiamo creato un altro collegamento allo stesso inodo. Come potete vedere, non abbiamo creato un file col nome b, abbiamo soltanto, invece, aggiunto un altro collegamento all'inodo numero 32555 nella stessa directory, e lo abbiamo chiamato b. Potete infatti vedere dall'output del comando ls -l che il contatore di collegamenti per questo inodo adesso ne riporta due, e non più uno soltanto.
Ora, se noi digitiamo:
$ rm a $ ls -il b 32555 -rw-rw-r-- 1 maria maria 0 dic 10 08:12 b $ |
notiamo che, malgrado il "file originale" sia stato cancellato, l'inodo esiste ancora, ma ora l'unico collegamento che fa riferimento ad esso è il file di nome /home/maria/example/b.
Su UNIX, pertanto, un file non ha un nome; ha, invece, uno o più collegamenti (link) in una o più directory.
Anche le directory vengono archiviate in inodi, ma il loro contatore di collegamenti, a differenza di tutti gli altri tipi di file, è il numero di sotto-directory che esse contengono. Esistono almeno due collegamenti per ogni directory: la directory stessa (.) e quella immediatamente superiore (..).
Le connessioni di rete costituiscono esempi tipici di file che non hanno collegamenti (cioè, che non hanno nome): non vedrete mai il file corrispondente alla vostra connessione al sito Mandrake Linux nell'albero delle directory, in qualunque directory lo cerchiate. Allo stesso modo, quando usate una pipe in una shell, l'inodo che corrisponde alla pipe esiste, ma non è collegato.