(Хм: наступне зараз трохи епічне ...)
Конструкція каталогу в файлових системах unix (які, як правило , є педантичними, але не обов'язково приєднуються до ОС Unix), представляє прекрасне розуміння, що фактично зменшує кількість необхідних спеціальних випадків.
«Каталог» - це справді лише файл у файловій системі. Весь власний вміст файлів у файловій системі знаходиться в inodes (з вашого запитання я бачу, що ви вже знаєте про деякі з цих матеріалів). На дисках немає структури - вони просто велика купа пронумерованих крапок байтів, розкиданих, як арахісове масло, на диску. Це не корисно, і справді відштовхує тих, хто має шматок охайності.
Тільки спеціальний індексний дескриптор номер індексного дескриптора 2 (не дорівнює 0 або 1, з причин традиції); inode 2 - файл каталогу: кореневий каталог . Коли система монтує файлову систему, вона «знає», що вона повинна перечитати 2-й варіант, щоб розпочати себе.
Файл-каталог - це лише файл із внутрішньою структурою, який повинен читати opendir (3) та друзі. Ви можете побачити її внутрішню структуру, задокументовану в dir (5) (залежно від вашої ОС); якщо ви подивитесь на це, ви побачите, що запис файлу каталогу не містить майже жодної інформації про файл - це все у файлі inode. Одне з небагатьох особливостей цього файлу полягає в тому, що функція open (2) призведе до помилки, якщо ви спробуєте відкрити файл каталогу у режимі, який дозволяє записувати. Різні інші команди (щоб вибрати лише один приклад hexdump
) відмовляться діяти нормально з файлами каталогів, тільки тому, що це, мабуть, не те, що ви хочете зробити (але це їх особливий випадок, а не файлова система).
Жорстка зв'язок нічого більше і не менш , ніж запис в карті директорії файлу. Ви можете мати два (або більше) записів на такій карті, які обидва відображають один і той же номер інода: такий inode має два (або більше) жорстких посилань. Це також пояснює, чому кожен файл має принаймні одне "жорстке посилання". У inode є довідковий підрахунок, який записує, скільки разів цей inode згадується у файлі каталогу десь у файловій системі (це число, яке ви бачите, коли це робите ls -l
).
Гаразд: ми зараз переходимо до справи.
Файл каталогів - це карта рядків ("імен файлів") до чисел (номерів inode). Ці номери inode є числами вкладень файлів, які знаходяться у цьому каталозі. Файли, що знаходяться в "каталозі", можуть містити інші файли каталогів, тому їхні числа індексів будуть серед перелічених у каталозі. Таким чином, якщо у вас є файл /tmp/foo/bar
, то файл каталогу foo
включає в себе запис для bar
, відображення цього рядка в inode для цього файлу. У файлі каталогів також є запис для файлу /tmp
каталогу, foo
який знаходиться в каталозі "in" /tmp
.
Коли ви створюєте каталог з mkdir (2), ця функція
- створює файл каталогу (з деяким номером inode) з правильною внутрішньою структурою,
- додає запис до батьківського каталогу, відображаючи ім'я нового каталогу в цьому новому inode (який містить одне з посилань),
- додає запис у новий каталог, відображаючи рядок '.' до того ж inode (це пояснює інше посилання) та
- додає ще один запис у новий каталог, відображаючи рядок ".." до inode файлу каталогу, який він змінив на кроці (2) (це враховує більшу кількість жорстких посилань, які ви побачите у файлах каталогів, які містять підкаталоги ).
Кінцевим результатом є те, що (майже) єдиними особливими випадками є:
- Функція open (2) намагається ускладнити стрілянину в ногу, запобігаючи відкриванню файлів каталогів для запису.
- Функція mkdir (2) робить речі приємними та легкими, додавши до нового файлу каталогу кілька додаткових записів ('.' Та '..'), щоб зручніше переміщатися по файловій системі. Я підозрюю, що файлова система працюватиме ідеально без "." і "..", але це буде біль для використання.
- Файл каталогів є одним з небагатьох типів файлів, які позначені як "особливі". Це дійсно те, що говорить про те, що відкриті (2) мають поводитися дещо інакше. Дивіться
st_mode
у stat (2).
(скопійовано з оригінального запитання stackoverflow, 2011-10-20)
..
жорсткі посилання, у вашому програмному забезпеченні для переходу по дереву вже має бути виняток "не слідкувати за циклами на батьківському посиланні каталогів" , тому це також має складність, за винятком.
посилання.