Um diretório é removido quando o número de links físicos se torna 0?

10

Um diretório é removido quando o número de links físicos se torna 0?

Um diretório sempre tem pelo menos 2 como número de links físicos, por causa de .. Quando rm -rum diretório, diminui o número de link físico de 2 para 0 por 2 em vez de 1?

O número de links físicos de um diretório pode ser 1?

Obrigado.

Tim
fonte

Respostas:

9

Em primeiro lugar, nem todos os sistemas de arquivos usam .e ..como links físicos. isso está documentado no manual do gnu find. Vou ignorar esses sistemas de arquivos pelo resto da minha resposta porque eles não foram projetados para unix e apenas complicam as coisas sem aumentar a clareza. Também vou ignorar o diretório raiz e os pontos de montagem pelo mesmo motivo.

o número de links para um diretório nunca é menor que dois por causa de .e ... O número de subdiretórios é igual ao número de links menos dois. Por esse motivo, você não pode vincular ou desvincular um diretório, o mesmo rm -rocorrerá com statum arquivo antes de excluir e usar em rmdirvez de unlinknos diretórios. As duas chamadas do sistema usam caminhos de código completamente diferentes no kernel.

hildred
fonte
Obrigado. Um diretório possui um link físico .., somente quando possui um subdiretório, correto? Portanto, ..nem sempre está presente em um diretório, certo?
Tim
..está presente em cada diretório que é um subdiretório. que é tudo, mas /também possui um, então todos os diretórios.
hildred
1
(1) Se um diretório não possui subdiretório, ele não possui um link físico ..para si. Quais são os links físicos para o dir? o arquivo com o nome do caminho e .? (2) por que você ignora os pontos de montagem?
Tim
Se o diretório for um subdiretório. a entrada ..apontará para o pai. Como um caso especial, o link do diretório raiz aponta para si mesmo. Isso permite que cd ..\..comandos semelhantes funcionem conforme o esperado, não importa onde você esteja. Você pode testar com o statcomando
BillThor
1
Você está certo de que a contagem de links nunca é menor que 2, mas não é por causa disso ... É por causa .e o nome no diretório pai que aponta para ele. A única exceção é a raiz, que não tem pai. Mas tem ..apontando para si mesmo, para que ele também tem contagem link = 2.
Barmar
11

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 rmdirchamada 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 unlinkchamada 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 rmcomando, aliás, impediu até mesmo a raiz de remover diretórios. E rm -rchamaria o rmdircomando para remover diretórios após esvaziar seu conteúdo.

Nesses sistemas históricos, o uso indevido da unlinkchamada de um programa executando como raiz, executando uma condição de corrida com rmdirou 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 dchecke ainda é uma das verificações, fsckpois 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 statpode 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.

Random832
fonte
2
strcpypara uma matriz de tamanho fixo em um executável setuid ... esses eram bons tempos!
Andrea Corbellini
@AndreaCorbellini Na verdade, existe uma exploração publicada com mkdirbase no fato de que ele deve fazer a mesma coisa ao contrário.
precisa saber é o seguinte
1
Eu acho que eu achei: securityfocus.com/archive/1/365038/2004-05-31/2004-06-06/0 :)
Andrea Corbellini
perguntando sobre rmdir, não removerin ..removeria o diretório pai?
Edward Torvalds
@edwardtorvalds Não, eu estava me referindo à remoção do próprio link "..", não do diretório pai para o qual ele aponta.
Random832