(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 katalogu foo
zawiera wpis dla bar
, 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
- tworzy plik katalogu (z pewnym numerem i-węzła) o właściwej strukturze wewnętrznej,
- dodaje pozycję do katalogu nadrzędnego, mapując nazwę nowego katalogu na ten nowy i-węzeł (który odpowiada za jeden z łączy),
- dodaje wpis do nowego katalogu, mapując ciąg „.” do tego samego i-węzła (dotyczy to drugiego łącza) i
- dodaje kolejny wpis do nowego katalogu, mapując ciąg „..” na i-węzeł pliku katalogu, który zmodyfikował w kroku (2) (odpowiada to większej liczbie twardych łączy widocznych w plikach katalogu zawierających podkatalogi ).
W rezultacie (prawie) jedynymi wyjątkowymi przypadkami są:
- Funkcja open (2) utrudnia strzelanie sobie w stopę, uniemożliwiając otwieranie plików katalogu do pisania.
- Funkcja mkdir (2) ułatwia i upraszcza dodawanie kilku nowych wpisów („.” I „..”) do nowego pliku katalogu, aby ułatwić poruszanie się po systemie plików. Podejrzewam, że system plików działałby doskonale bez „.” i „..”, ale korzystanie z niego byłoby uciążliwe.
- Plik katalogu jest jednym z nielicznych typów plików oznaczonych jako „specjalne” - tak naprawdę nakazuje to, aby open (2) zachowywał się nieco inaczej. Zobacz
st_mode
w stat (2).
(skopiowane z oryginalnego pytania Stackoverflow, 2011-10-20)
..
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 .