3. Links

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:

Mas agora, se digitarmos:

$ 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.

Agora, se fizermos:

$ 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.