Qualquer arquivo em um sistema de arquivos UNIX convencionalmente projetado cuja referência de contagem (por exemplo, a soma da contagem de hardlink e o número de identificadores de arquivo aberto *) atinge 0 é removido. No entanto, nos sistemas UNIX modernos, a chamada de sistema rmdir
remove um diretório vazio em uma única operação em vez de remover .
e ..
um por um.
Em sistemas UNIX históricos, no entanto, essa chamada de sistema não existia. Em vez disso, o comando rmdir
era um programa setuid ( código-fonte pode ser encontrado aqui ) que verificou se um diretório estava vazio (exceto as entradas especiais) e, em seguida, removeu ..
e .
, nessa ordem, e depois removeu o próprio diretório, todos com a chamada de sistema unlink
que somente a raiz tinha permissão para usar nos diretórios (daí porque o comando era setuid). Então, nesses sistemas, a contagem de links de um diretório seria momentaneamente 1 depois que .
fosse removido, mas antes que o diretório fosse removido do diretório pai, então seria 0.
O comando rm
, aliás, impediu que até mesmo root removesse diretórios. E rm -r
chamaria o comando rmdir
para remover diretórios depois de esvaziar seu conteúdo.
Nesses sistemas históricos, use indevidamente a chamada unlink
de um programa em execução 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 (moderno impedir isso), pode resultar em arquivos pendentes ou diretórios 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 em fsck
, já que permanece fisicamente possível na maioria dos sistemas de arquivos.
Os sistemas de arquivos não são, por acaso, necessários para implementar diretórios (incluindo .
e ..
) como arquivos normais que possuem hardlinks. Nesses sistemas de arquivos, a contagem de hardlink de um diretório será sempre relatada como 0
(mas, é claro, sua existência no diretório pai é qualificada para uma "contagem de referência" de 1).
O comportamento de um diretório removido (por exemplo, quando examinado por um processo que já o tenha aberto ou o possui como seu 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, relatará uma contagem de hardlink de 2 , mesmo que não tenha hardlinks reais. Mesmo que .
e ..
não apareçam na listagem, o diretório pode ser aberto e stat
pode ser chamado com o nome .
ou ..
. No Linux, a contagem de links é 0, mas .
e ..
também funcionam.
O Mac OS X também informa 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, executar binários e bibliotecas compartilhadas) e processar diretórios atuais.