Il modo migliore per capire cosa sta alla base del concetto di collegamento è quello di fare un esempio. Creiamo perciò un file di tipo normale:
$ pwd /home/queen/example $ ls $ touch a $ ls -il a 32555 -rw-rw-r-- 1 queen queen 0 dic 10 08:12 a |
L'opzione -i del comando ls visualizza il numero di inode, che si trova sul 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 link del file (dell'inode, in realtà).
Il comando touch a può essere scomposto in due azioni separate:
la creazione di un inode, 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 inode, il cui nome è a, all'interno della directory corrente, /home/queen/example. Il file /home/queen/example/a, pertanto, è un collegamento all'inode numero 32555 e, al momento, è l'unico collegamento esistente: il contatore mostra uno.
Ma adesso, se digitiamo:
$ ln a b $ ls -il a b 32555 -rw-rw-r-- 2 queen queen 0 dic 10 08:12 a 32555 -rw-rw-r-- 2 queen queen 0 dic 10 08:12 b $ |
abbiamo creato un altro collegamento allo stesso inode. Come potete vedere, non abbiamo creato un file col nome b, abbiamo soltanto, invece, aggiunto un altro collegamento all'inode 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 inode adesso ne riporta due, e non più uno soltanto.
Ora, se noi digitiamo:
$ rm a $ ls -il b 32555 -rw-rw-r-- 1 queen queen 0 dic 10 08:12 b $ |
notiamo che, malgrado il "file originale" sia stato cancellato, l'inode esiste ancora. Ma ora l'unico collegamento che fa riferimento a quest'ultimo è il file di nome /home/queen/example/b.
Sotto 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 inode, ma il loro contatore di collegamenti, a differenza di tutti gli altri tipi di file, è il numero di sotto-directory contenuto al loro interno. 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 Linux-Mandrake nell'albero delle directory, qualunque sia la directory che state utilizzando. Allo stesso modo, quando usate una pipe in una shell, l'inode che corrisponde alla pipe esiste, ma non è collegato.