Każdy plik w konwencjonalnie zaprojektowanym systemie plików UNIX, którego liczba referencyjna (np. Suma liczby hardlink i liczby otwartych uchwytów plików *) osiąga 0, jest usuwana. Jednak w nowoczesnych systemach UNIX rmdir
wywołanie systemowe usuwa pusty katalog w jednej operacji zamiast usuwania .
i ..
jeden po drugim.
Jednak w historycznych systemach UNIX to wywołanie systemowe nie istniało. Zamiast tego rmdir
polecenie było programem setuid ( można tu znaleźć kod źródłowy ), który sprawdził, czy katalog jest pusty (inny niż wpisy specjalne), a następnie usunął ..
i .
, w tej kolejności, a następnie usunął sam katalog, wszystko za pomocą unlink
wywołanie systemowe, którego tylko root mógł używać w katalogach (dlatego polecenie było setuid). W tych systemach liczba odsyłaczy do katalogu wynosiłaby na chwilę 1 po .
usunięciu, ale przed usunięciem katalogu z katalogu nadrzędnego, wynosiłaby 0.
rm
Polecenia, nawiasem mówiąc, nawet zapobiec pierwiastek z usuwania katalogów. I rm -r
woła rmdir
polecenie, aby usunąć katalogi po opróżnieniu ich zawartości.
W tych historycznych systemach niewłaściwe użycie unlink
wywołania z programu działającego jako root, uruchomionego do wyścigu z rmdir
lub mv
, lub utworzenia pliku w procesie, którego bieżący katalog został usunięty (współczesne systemy temu zapobiegają), może spowodować zawieszenie plików lub katalogów które mają twardą liczbę linków powyżej 0, ale nie istnieją w drzewie katalogów. Ten warunek został wykryty przez dcheck
i nadal jest jednym z testów, fsck
ponieważ jest fizycznie możliwy w większości systemów plików.
Nawiasem mówiąc, systemy plików nie są wymagane do implementacji katalogów (w tym .
i ..
) jako normalnych plików, które mają dowiązania twarde. W tych systemach plików liczba dowiązań twardych katalogu zawsze będzie zgłaszana jako 0
(ale oczywiście jego istnienie w katalogu nadrzędnym kwalifikuje się do „liczby referencji” równej 1).
Zachowanie usuniętego katalogu (np. Podczas sprawdzania przez proces, który już go otworzył lub ma go jako katalog bieżący) oraz dokładne znaczenie „liczby linków” katalogu są nieokreślone. Na przykład w systemie Mac OS X zgłosi liczbę Hardlink 2 , mimo że nie ma prawdziwych hardlinków. Choć .
i ..
nie pojawiają się w zestawieniu, katalog może być otwarty i stat
może być wywołana z nazwą .
lub ..
. W systemie Linux, liczba link jest 0, ale .
i ..
również nadal pracować.
Mac OS X zgłasza również liczbę wszystkich plików w katalogu jako liczbę łączy, a nie tylko liczbę podkatalogów. Ale to nawet wtedy, gdy 2 .
i ..
zniknęły.
* Obejmuje to normalne otwarte deskryptory, sekcje mapowane w pamięci (w tym np. Wykonywanie plików binarnych i bibliotek współdzielonych) oraz przetwarzanie bieżących katalogów.
..
, tylko jeśli ma podkatalog, prawda? Więc..
nie zawsze jest obecny dla katalogu, prawda?