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 rmdir
chiamata 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 unlink
chiamata 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 rm
comando, per inciso, ha impedito persino a root di rimuovere le directory. E rm -r
chiamerebbe il rmdir
comando per rimuovere le directory dopo aver svuotato il loro contenuto.
Su questi sistemi storici, l'uso improprio della unlink
chiamata da un programma in esecuzione come root, l'esecuzione in una race condition con rmdir
o 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 dcheck
ed è ancora uno dei check in fsck
poiché 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 stat
può 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.
..
, solo quando ha una sottodirectory, giusto? Quindi..
non è sempre presente per una directory, giusto?