6

В настоящее время я разрабатываю поддельную файловую систему для браузерной игры. Я недавно реализовал ".." и "." папки, поэтому каждая папка имеет ссылку на своего родителя. Затем я проверил в своем терминале, есть ли в этих папках "/". На самом деле я был очень удивлен, что у него есть каталог "..", который, очевидно, является ссылкой на себя.

Является ли причина такой последовательности или есть лучшее объяснение?

Изменить: я в основном ищу документ, где это задокументировано.

4 ответа4

5

Единая спецификация UNIX гласит:

В особом случае в корневом каталоге точка-точка может ссылаться на сам корневой каталог.

В стандарте не указана причина. Для официального "почему?"ответ, возможно, вам придется обратиться к Кену Томпсону напрямую.

3

Вот это определение POSIX :

3.144 Пустой каталог

Каталог, который содержит не более записей каталога для точек и точек и содержит ровно одну ссылку на него (кроме своей собственной записи точек, если таковая существует)в точке-точке.

Это определение повторяется с разными фразами в описаниях POSIX всех файловых команд.
Например, для rmdir :

Определение пустого каталога - это то, которое содержит, самое большее, записи каталога для точек и точек-точек.

Вышеупомянутое запутанное определение пустого каталога, очевидно, стоит за этим забавным соглашением, и его цель - избежать любых исключений из правила, даже для косой черты (/).

3

Обход файловой системы.

Когда вы смотрите на имя файла в системах Unix, вы смотрите на корневое дерево.

Когда вы смотрите на файл, он находится в каталоге. Вы можете спросить этот каталог, что это такое, поднявшись на уровень (..) и проверив наличие inode каталога, в котором вы находитесь. Затем вы повторяете, и вы можете создать, где вы находитесь. Но когда вы дойдете до корня, нет вверх. Здесь есть только «здесь». Установив '.' и '..' к тому же значению, вы устанавливаете уникальный сигнал, который не может иметь никакой другой каталог в этой файловой системе. Это корень.

Когда вы монтируете файловую систему в другую точку монтирования - у вас есть файловая система /home на другом диске, например, вы перезаписываете «..» со ссылкой на точку монтирования в корневой файловой системе. Таким образом, смонтированный корень файловой системы, который имел «.» и «..», которые были одинаковыми, теперь имеют разные значения.

Имея "." и «..» повторяют одни и те же данные - важный, уникальный сигнал, истинный только для вершины дерева. И это говорит программам обхода, что они могут прекратить искать родительские узлы.

Я думаю, что есть касательная документация в Lions Commentary To The Unix Kernel версии 6. Примерно на стр. 84, где описывается, как обрабатывается точка монтирования.

1

Мне нравятся другие ответы, и я хотел бы добавить, что часть того, что имеет смысл (по крайней мере, для меня), состоит в том, что каталоги - это, по сути, особые типы файлов. Любой "специальный" тип файла в UNIX имеет обязательные атрибуты, которые делают его соответствующим его "специальной" классификации типов. Без ВСЕХ этих атрибутов система может не распознать его таким, каким он должен быть, или может неправильно его интерпретировать. Вы можете просмотреть каталог как файл, используя, скажем, vim. Например, если вы посмотрите на любой каталог в вашей системе с помощью vim,

$ vim ~

вы увидите, что первая незакомментированная вещь, указанная в этом "файле", - это «../», то есть первая вещь, указанная в этом специальном файле, - это родительский каталог, и, как вы ожидаете, его родитель на один уровень вверх. , Но если вы вместо этого попробуйте

$ vim /

в первой строке без комментариев вы увидите «./» вместо «../». Почему разница и почему она должна быть здесь? «/» должен иметь "родителя" в списке, чтобы соответствовать требованиям распознавания в качестве специального файла типа "каталог". Без этого перечисления вначале было бы так, как если бы в «/» был указан другой родительский элемент (т. Е. Все, что было в начале в специальном файле «/»), и я подозреваю (но не подтвердил), что это приведет к одному из его потомков быть интерпретированным как его родитель, создавая цикличность в файловой системе, т. е. это больше не будет корневая файловая система, а скорее круговая! Другими словами, если система всегда будет интерпретировать первую запись в "файле каталога" как "родитель этого каталога", то «/» должен иметь соответствующий первый список для правильной интерпретации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .