Una directory viene rimossa quando il suo numero di hard link diventa 0?


10

Una directory viene rimossa quando il suo numero di hard link diventa 0?

Una directory ha sempre almeno 2 come numero di hard link, a causa di .. Quando rm -runa directory, riduce il numero di hard link da 2 a 0 di 2 anziché 1?

Il numero di collegamenti reali di una directory può mai essere 1?

Grazie.

Risposte:


9

Innanzitutto non tutti i filesystem usano .e ..come hard link. questo è documentato nel manuale di ricerca di gnu. Ignorerò questi filesystem per il resto della mia risposta perché non sono stati progettati per unix e complicano solo le cose senza aggiungere chiarezza. Ho anche intenzione di ignorare la directory principale e montare i punti per lo stesso motivo.

il numero di collegamenti a una directory non è mai inferiore a due a causa di .e ... Il numero di sottodirectory è uguale al numero di collegamenti meno due. Per questo motivo non è possibile collegare o scollegare una directory, così rm -rsarà statun file prima di eliminarlo e utilizzarlo rmdiranziché unlinknelle directory. Le due chiamate di sistema usano percorsi di codice completamente diversi nel kernel.


Grazie. Una directory ha un hard link .., solo quando ha una sottodirectory, giusto? Quindi ..non è sempre presente per una directory, giusto?
Tim

..è presente in ogni directory che è una sottodirectory. che è tutto tranne /che ha anche uno, quindi tutte le directory.
hildred

1
(1) Se una directory non ha un sottodirectory, la directory non ha un hard link ..a se stessa. Quali sono i collegamenti diretti alla directory? il file con il nome percorso e .? (2) perché ignori i mount points?
Tim

Se la directory è una sottodirectory. la voce ..punterà al genitore. Come caso speciale, il collegamento alla directory principale punta a se stesso. Ciò consente a cd ..\..comandi simili di funzionare come previsto, indipendentemente da dove ti trovi. Puoi testare con il statcomando.
BillThor,

1
Hai ragione sul fatto che il conteggio dei collegamenti non è mai inferiore a 2, ma non a causa di ... È a causa di .e il nome nella directory principale che lo indica. L'unica eccezione è la radice, che non ha un genitore. Ma ha ..puntato su se stesso, quindi ha anche un conteggio dei collegamenti = 2.
Barmar,

11

Qualsiasi file su un filesystem UNIX progettato in modo convenzionale il cui conteggio dei riferimenti (ad es. La somma del conteggio dei collegamenti fissi e il numero di handle di file aperti *) raggiunge 0 viene rimosso. Tuttavia, sui moderni sistemi UNIX, la rmdirchiamata di sistema rimuove una directory vuota in una singola operazione anziché rimuoverla .e ..una a una.

Nei sistemi UNIX storici, tuttavia, questa chiamata di sistema non esisteva. Invece, il rmdir comando era un programma setuid ( il codice sorgente può essere trovato qui ) che controllava che una directory fosse vuota (oltre alle voci speciali), quindi rimossa ..e ., in quell'ordine, e quindi rimossa la directory stessa, il tutto con il unlinkchiamata di sistema che solo root poteva usare nelle directory (quindi perché il comando era impostato su). Quindi, su quei sistemi, il conteggio dei collegamenti di una directory sarebbe momentaneamente 1 dopo la .rimozione, ma prima che la directory fosse rimossa dalla directory padre, sarebbe 0.

Il rmcomando, per inciso, ha impedito persino a root di rimuovere le directory. E rm -rchiamerebbe il rmdircomando per rimuovere le directory dopo aver svuotato il loro contenuto.

Su questi sistemi storici, l'uso improprio della unlinkchiamata da un programma in esecuzione come root, l'esecuzione in una race condition con rmdiro mv, o la creazione di un file in un processo la cui directory corrente è stata eliminata (i sistemi moderni lo impediscono), potrebbero causare file o directory penzolanti che hanno un conteggio hardlink superiore a 0 ma non esistono nella struttura di directory. Questa condizione è stata rilevata dchecked è ancora uno dei check in fsckpoiché rimane fisicamente possibile sulla maggior parte dei filesystem.


Per inciso, i filesystem non sono tenuti ad implementare le directory (inclusi .e ..) come file normali che hanno hardlink. Su questi filesystem, il conteggio dei collegamenti hardlink di una directory sarà sempre riportato come 0(ma ovviamente, la sua esistenza nella directory padre si qualifica per un "conteggio di riferimento" di 1).


Il comportamento di una directory rimossa (ad es. Quando esaminato da un processo che lo ha già aperto o lo ha come directory corrente) e il significato esatto del "conteggio dei collegamenti" di una directory non sono specificati. Su Mac OS X, ad esempio, segnalerà un conteggio hardlink pari a 2 , anche se non ha collegamenti reali. Anche se .e ..non compaiono nell'elenco, la directory può essere aperta e statpuò essere chiamata con il nome .o ... Su Linux, la conta dei collegamenti è 0, ma .e ..allo stesso modo ancora lavoro.

Mac OS X riporta anche il numero di tutti i file in una directory come conteggio dei collegamenti, anziché solo il numero di sottodirectory. Ma sono 2 anche quando .e se ne ..sono andati.


* Include normali descrittori aperti, sezioni mappate in memoria (incluso ad esempio l'esecuzione di binari e librerie condivise) e l'elaborazione delle directory correnti.


2
strcpya un array di dimensioni fisse in un eseguibile setuid ... erano tempi buoni!
Andrea Corbellini,

@AndreaCorbellini In realtà esiste un exploit pubblicato per mkdiril fatto che deve fare la stessa cosa al contrario.
Casuale 832,


chiedendo rmdir, la ..rimozione non rimuove la directory principale?
Edward Torvalds,

@edwardtorvalds No, mi riferivo alla rimozione del link ".." stesso, non alla directory principale a cui punta.
Casuale 832
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.