W systemie Unix plik zazwyczaj stanowi pewien wpis w tabeli plików. Istnieją różne rodzaje plików: zwykłe pliki, urządzenia, linki symbolik, drzwi, rury, gniazda, katalogi ...
Numer i-węzła (który można zobaczyć na wyjściu ls -i
) to indeks w tej tabeli.
Teraz nie masz dostępu do plików według i- węzła, ale według ścieżki . Ścieżka jest łańcuchem katalogów wpisów. Zauważysz, że nie mówimy tutaj o folderze, ale o katalogu . Ponieważ taki jest katalog (pomyśl o książce telefonicznej).
Katalog to specjalny rodzaj pliku, który nadaje nazwy wielu i-węzłom. Wpis w katalogu to odwzorowanie nazwy na i-węzeł.
Dany plik (i-węzeł) może mieć więcej niż jedną nazwę w jednym katalogu (tak jak może istnieć więcej niż jedna nazwa pod numerem telefonu), a także może mieć nazwy (wpisy) w więcej niż jednym katalogu. Nazywa się je również linkami znanymi jako twarde, które można odróżnić za pomocą linków miękkich (specjalny typ pliku, który jest wskaźnikiem ścieżki).
Plik (i-węzeł) śledzi liczbę odnośników (wpisów w dowolnym katalogu), które posiada, dzięki czemu, gdy liczba osiągnie 0 (gdy jest odłączony od ostatniego katalogu, do którego się odwołuje), zostaje cofnięta.
Jest to liczba (liczba linków) wyświetlana na ls -l
wyjściu.
Kiedy po raz pierwszy plik nie zostanie utworzony katalog (z open
lub creat
(lub bind
lub mknod
dla niektórych typów plików) wywołuje System), odbywa się poprzez dostarczenie ze ścieżką do nowego pliku (jak "/a/b"
). To, co się wtedy dzieje, to nowy plik i i-węzeł jest przydzielany, a nowy wpis jest dodawany do katalogu związanego z "a"
nazwą w "/"
katalogu głównym. To jest początkowy link, więc liczba linków wynosi jeden.
Więcej łączy można dodać później za pomocą link()
wywołania systemowego ( ln
polecenia). Łącza można usunąć za pomocą unlink()
wywołania systemowego ( rm
polecenia).
Zauważysz, że pliki katalogu typu mają zazwyczaj liczbę linków większą lub równą 2.
Teraz, gdy tworzysz katalog, wywołujesz wywołanie mkdir()
systemowe. Coś jak mkdir("/a/b")
. Następnie przydziela nowy plik katalogu typu. W tym nowym katalogu automatycznie tworzy dwa wpisy:
"."
( kropka na katalog ). Który jest linkiem do siebie. Więc liczba linków wynosi teraz 1.
".."
(dla katalogu jest katalog ). Który jest linkiem do "/a"
. Więc liczba linków "/a"
jest zwiększana o jeden
Następnie ten nowy katalog jest łączony "/a"
( "/a"
dla niego dodawany jest wpis ), więc jego liczba odsyłaczy wynosi teraz 2. Jeśli "/a/b/c"
katalog zostanie utworzony, z powodu ".."
wpisu "/a/b/c"
, liczba odsyłaczy "/a/b"
zmieni się na 3.
Większość Unices ogranicza tworzenie dalszych linków do katalogu, ponieważ mogą powodować problematyczne pętle. Jeśli pozwalają link()
na katalog, zazwyczaj tylko administrator może to zrobić.
Niektóre systemy plików, jak na przykład, btrfs
odchodzą od tej tradycyjnej struktury katalogów. Zauważysz, że liczba linków w katalogach w btrfs
systemach plików jest zawsze równa jeden, mimo że katalogi te zawierają "."
wpis o takim samym numerze i-węzła, jak w nich samych.
Fakt, że liczba łączy wynosi tradycyjnie 2 plus liczba podkatalogów, ma swoje zastosowanie. Na przykład w:
find . -name '*.c' -print
Jeśli .
nie zawiera podkatalogów, ale zawiera miliony plików. Sprawdzając liczbę linków .
, find
możesz wiedzieć, że nie ma podkatalogu. Wszystko, find
co należy zrobić, to przeczytać zawartość katalogu i zgłosić wpisy, które kończą się na .c
(jak grep '\.c$'
na pliku o wielkości kilku megabajtów, nic wielkiego). W przeciwnym razie find
musiałby sprawdzić typ każdego pojedynczego pliku, aby sprawdzić, czy są w nim katalogi, do których można zejść (powodując tyle lstat()
wywołań systemowych). Oczywiście tego rodzaju optymalizacja nie działa btrfs
(chociaż we współczesnych wersjach systemu Linux typ plików jest także zapisywany we wpisie katalogu dla niektórych systemów plików (w tym btrfs
) i zwracany przez getdents(2)
wywołanie systemowe użyte do pobrania listy wpisów w katalogu, więclstat
nadal nie jest konieczne).