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