Qualquer arquivo em um sistema de arquivos UNIX convencionalmente projetado, cuja contagem de referência (por exemplo, a soma da contagem do hardlink e o número de identificadores de arquivos abertos *) atinge 0 é removida. No entanto, em sistemas UNIX modernos, a rmdir
chamada de sistema remove um diretório vazio em uma única operação, em vez de remoção .
e ..
um por um.
Nos sistemas históricos do UNIX, no entanto, essa chamada do sistema não existia. Em vez disso, o rmdir
comando era um programa setuid (o código-fonte pode ser encontrado aqui ) que verificava se um diretório estava vazio (exceto as entradas especiais) e, em seguida, era removido ..
e .
, nessa ordem, e então o próprio diretório, todos com o comando unlink
chamada de sistema que somente o root tinha permissão para usar em diretórios (por isso, o comando foi setuid). Portanto, nesses sistemas, a contagem de links de um diretório seria momentaneamente 1 após a .
remoção, mas antes que o diretório fosse removido do diretório pai, seria 0.
O rm
comando, aliás, impediu até mesmo a raiz de remover diretórios. E rm -r
chamaria o rmdir
comando para remover diretórios após esvaziar seu conteúdo.
Nesses sistemas históricos, o uso indevido da unlink
chamada de um programa executando como raiz, executando uma condição de corrida com rmdir
ou mv
, ou criando um arquivo em um processo cujo diretório atual foi excluído (os sistemas modernos evitam isso), pode resultar em arquivos ou diretórios pendentes que têm uma contagem de hardlink acima de 0, mas não existem na árvore de diretórios. Essa condição foi detectada por dcheck
e ainda é uma das verificações, fsck
pois permanece fisicamente possível na maioria dos sistemas de arquivos.
Incidentalmente, os sistemas de arquivos não são necessários para implementar diretórios (incluindo .
e ..
) como arquivos normais que possuem hardlinks. Nesses sistemas de arquivos, a contagem de links físicos de um diretório sempre será relatada como 0
(mas é claro, sua existência no diretório pai se qualifica para uma "contagem de referência" de 1).
O comportamento de um diretório removido (por exemplo, quando examinado por um processo que já está aberto ou o possui como diretório atual) e o significado exato da "contagem de links" de um diretório não são especificados. No Mac OS X, por exemplo, ele relatará uma contagem de links físicos de 2 , mesmo que não possua links reais. Embora .
e ..
não aparecem na listagem, o diretório pode ser aberto e stat
pode ser chamado com o nome .
ou ..
. No Linux, a contagem da ligação é 0, mas .
e ..
do mesmo modo ainda trabalho.
O Mac OS X também relata o número de todos os arquivos em um diretório como a contagem de links, em vez de apenas o número de subdiretórios. Mas é 2 mesmo quando .
e ..
se foram.
* Isso inclui descritores abertos normais, seções mapeadas na memória (incluindo, por exemplo, a execução de binários e bibliotecas compartilhadas) e o processo de diretórios atuais.
..
, somente quando possui um subdiretório, correto? Portanto,..
nem sempre está presente em um diretório, certo?