A melhor maneira de entender o que é um link é olhando um exemplo. Vamos criar um arquivo (normal):
$ pwd /home/usuario1/example $ ls $ touch a $ ls -il a 32555 -rw-r--r-- 1 usuario1 usuario1 0 Aug 6 19:26 a
A opção -i
do comando
ls imprime o número do inode, que é o primeiro
campo na saída. Como você pode ver, antes de criarmos o arquivo
a
, não havia arquivos no diretório. O outro
campo de interesse é o terceiro, que indica o número de links do
arquivo (links de inode, na verdade).
O comando touch a pode ser separado em duas ações distintas:
criação de um inode, para o qual o sistema operacional deu o número 32555, e que o seu tipo é o de um arquivo normal;
criação de um link para este inode,
chamado a
, no diretório atual
(/home/usuario1/example
). Assim sendo, o
arqivo /home/usuario1/example/a
é um link
para o inode de número 32555, e é atualmente o único, pois o
contador de link indica 1
.
$ ln a b $ ls -il a b 32555 -rw-r--r-- 2 usuario1 usuario1 0 Aug 6 19:26 a 32555 -rw-r--r-- 2 usuario1 usuario1 0 Aug 6 19:26 b $
Nós criamos outro link para o mesmo
inode. Como você pode ver, nós não criamos um arquivo chamado
b
. Ao invés disso, nós adicionamos um link
para o inode de número 32555 no mesmo diretório, e atribuímos o
nome b
a este novo link. Você pode ver na
saída do ls -l que o contador de link para o
inode indica 2 em vez de 1.
$ rm a $ ls -il b 32555 -rw-r--r-- 1 usuario1 usuario1 0 Aug 6 19:26 b $
Nós podemos verificar que, mesmo após
apagarmos o “arquivo original”, o inode continua
existindo. Mas agora, o único link para ele é o arquivo chamado /home/usuario1/example/b
.
Então um arquivo no UNIX® não possui nome; mas sim um ou mais link(s) em um ou mais diretórios.
Os próprios diretórios
também são armazenados em inodes. A contagem de links para eles é
de acordo com o número de subdiretórios que eles possuem. E por
isso há pelo menos dois links por diretório: o próprio diretório
(representado pela entrada .
) e o seu
diretório pai (representado por ..
). Então um
diretório com dois subdiretórios terá no mínimo quatro links:
.
, ..
e os links para
cada subdiretório.
Exemplos típicos de
arquivos que não estão referenciados (ex.: não possuem nome) são
conexões de rede. Você nunca verá o arquivo correspondente a sua
conexão ao web site da
Mandriva Linux na sua árvore de arquivo, não importa
qual diretório você procure. De maneira similar, quando você usa um
pipe no shell
, o inode
correspondente ao pipe existe, mas nao está referenciado. Arquivos
temporários sao outros exemplos de inodes sem nomes. Você cria um
arquivo temporário, abre ele, e então remove-o. A arquivo existe
enquanto está aberto, mas ninguém mais pode abrí-lo (já que não
existe nome para abrí-lo). Desta forma, se a aplicação travar, o
arquivo temporário é removido automaticamente.