Widziałem wiele wyjaśnień, dlaczego liczba linków do pustego katalogu w systemach operacyjnych opartych na Uniksie wynosi 2 zamiast 1. Wszyscy mówią, że to z powodu „.” katalog, który każdy katalog wskazuje na siebie. Rozumiem, dlaczego mam pojęcie „”. jest przydatny do określania ścieżek względnych, ale co zyskuje się, wdrażając go na poziomie systemu plików? Dlaczego nie tylko powłoki lub wywołania systemowe, które podążają ścieżkami, wiedzą, jak to interpretować?
To, że „..” jest prawdziwym linkiem, ma dla mnie o wiele większy sens - system plików musi przechowywać wskaźnik z powrotem do katalogu nadrzędnego, aby się do niego przejść. Ale nie rozumiem, dlaczego ”. bycie prawdziwym łącznikiem jest konieczne. Wydaje się również, że prowadzi to do brzydkiego specjalnego przypadku w implementacji - można by pomyśleć, że można zwolnić miejsce zajmowane przez i-węzły, które mają liczbę linków mniejszą niż 1, ale jeśli są to katalogi, trzeba sprawdzić link liczy mniej niż 2. Dlaczego niespójność?
źródło
..
linki twarde, Twoje oprogramowanie do chodzenia po drzewach musi już mieć wyjątki „nie wykonuj cykli w łączu katalogu nadrzędnego” , więc dodanie złożonego.
łącza jest mało skomplikowane .Odpowiedzi:
Rzeczywiście interesujące pytanie. Na pierwszy rzut oka dostrzegam następujące zalety:
Przede wszystkim stwierdzasz, że interpretacja „
.
” jako bieżącego katalogu może być wykonana przez Shell lub przez wywołania systemowe. Ale wpisanie kropki w katalogu faktycznie eliminuje tę konieczność i wymusza spójność na jeszcze niższym poziomie.Ale nie sądzę, że była to podstawowa idea tej decyzji projektowej.
Podczas tworzenia lub usuwania pliku z katalogu należy także zaktualizować znacznik czasu modyfikacji katalogu. Ten znacznik czasu jest przechowywany w jego i-węźle. Numer i-węzła jest przechowywany w odpowiednim wpisie katalogu.
JEŻELI nie będzie tam wpisu kropki, procedury będą musiały wyszukać numer i-węzła przy wpisie dla tego katalogu w katalogu nadrzędnym, co spowodowałoby ponowne wyszukiwanie katalogu.
ALE na szczęście jest kropka w bieżącym katalogu. Procedura, która dodaje lub usuwa plik w bieżącym katalogu, musi po prostu wrócić do pierwszego wpisu (gdzie zwykle znajduje się wpis kropki) i natychmiast znalazła numer i-węzła dla bieżącego katalogu.
Jest jeszcze trzecia fajna rzecz na temat wprowadzania kropek:
Gdy
fsck
sprawdza zgniły system plików i ma do czynienia z niepołączonymi blokami, które również nie znajdują się na liście wolnej, łatwo jest sprawdzić, czy blok danych (interpretowany jako lista katalogów) ma pozycję kropki wskazującą na i-węzeł co z kolei wskazuje na ten blok danych. Jeśli tak, ten blok danych można uznać za utracony katalog, który należy ponownie połączyć.źródło
.
w bieżącym katalogu. Chyba że można znaleźć jądro, w którym tak naprawdę działa (wątpię ...)(Hmm: poniższe jest teraz trochę epickie ...)
Projektowanie katalogu na systemach plików Unix (które mają być pedantyczne, zazwyczaj są, ale niekoniecznie dołączone do systemów operacyjnych UNIX), zapewnia wspaniały wgląd, który faktycznie zmniejsza liczbę wymaganych specjalnych przypadków.
„Katalog” to tak naprawdę tylko plik w systemie plików. Cała rzeczywista zawartość plików w systemie plików jest w i- węzłach (z twojego pytania widzę, że już znasz niektóre z tych rzeczy). I-węzły na dysku nie mają żadnej struktury - to tylko duża liczba ponumerowanych bloków bajtów, rozmieszczonych na dysku jak masło orzechowe. To nie jest użyteczne i rzeczywiście jest odpychające dla każdego, kto ma odrobinę schludności.
Tylko specjalny-węzła jest liczba iwęzeł 2 (nie oznacza 0 lub 1, z uwagi na tradycji); i-węzeł 2 to plik katalogu: katalog główny . Kiedy system montuje system plików, „wie”, że musi przeczytać i-węzeł 2, aby się uruchomić.
Plik katalogu to tylko plik o wewnętrznej strukturze, który jest przeznaczony do odczytu przez opendir (3) i znajomych. Możesz zobaczyć jej wewnętrzną strukturę udokumentowaną w katalogu (5) (w zależności od systemu operacyjnego); jeśli na to spojrzysz, zobaczysz, że pozycja pliku katalogu prawie nie zawiera informacji o pliku - to wszystko w i-węzle pliku. Jedną z niewielu rzeczy, które są szczególne w tym pliku, jest to, że funkcja open (2) wyświetli błąd, jeśli spróbujesz otworzyć plik katalogu w trybie, który pozwala na zapis. Różne inne polecenia (aby wybrać tylko jeden przykład
hexdump
), odmawiają normalnego działania z plikami katalogów, tylko dlatego, że prawdopodobnie nie tego chcesz (ale to jest ich szczególny przypadek, a nie system plików).Twrdym jest niczym więcej ani mniej niż wpisu mapie pliku o za. Możesz mieć dwa (lub więcej) wpisy na takiej mapie, które oba mapują na ten sam numer i-węzła: dlatego i-węzeł ma zatem dwa (lub więcej) twarde łącza. To wyjaśnia również, dlaczego każdy plik ma co najmniej jeden „twardy link”. I-węzeł ma liczbę odwołań, która rejestruje, ile razy wspomniany i-węzeł jest wymieniony w pliku katalogu gdzieś w systemie plików (jest to liczba, którą widzisz, gdy to robisz
ls -l
).OK: teraz dochodzimy do sedna.
Plik katalogu jest mapą ciągów („nazw plików”) na liczby (liczby i-węzłów). Te liczby i-węzłów są liczbami i-węzłów plików, które znajdują się w tym katalogu. Pliki znajdujące się w tym katalogu mogą zawierać inne pliki katalogu, więc ich numery i-węzłów będą należeć do tych wymienionych w katalogu. Tak więc, jeśli masz plik
/tmp/foo/bar
, to plik katalogufoo
zawiera wpis dlabar
, odwzorowanie tego ciągu na i-węzeł dla tego pliku. W pliku katalogu znajduje się także wpis dotyczący pliku/tmp
katalogu,foo
który znajduje się w katalogu/tmp
.Gdy tworzysz katalog za pomocą mkdir (2), ta funkcja
W rezultacie (prawie) jedynymi wyjątkowymi przypadkami są:
st_mode
w stat (2).(skopiowane z oryginalnego pytania Stackoverflow, 2011-10-20)
źródło