Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Акуленок_часть1.doc
Скачиваний:
39
Добавлен:
13.11.2019
Размер:
1.43 Mб
Скачать

4.4. Дескриптор обычного файла

Каждый файл UNIX имеет описатель файла (или дескриптор) размером 64 байта (структуру его можно посмотреть в файле /usr/include/sys/inode.h), который содержит следующую информацию:

  • определение типа файла (обычный, каталог или специальный файл);

  • идентификатор владельца и группы;

  • режим доступа к файлу – разрешения, которые даны пользователям и пользовательским группам (разрешения на чтение, изменение и запуск файла);

  • счетчик числа ссылок на файл (связей);

  • размер – число байтов в файле;

  • дату и время создания файла, дату и время его последней модификации, и дату и время последнего обращения (доступа);

  • адреса блоков данных.

Описатель файлов хранится в составе таблицы дескрипторов (i-node table) на диске в некотором блоке. Дескриптор файла характеризуется своим индексом (местом) в таблице дескрипторов.

4.5. Дескриптор каталога

Наличие обычных файлов недостаточно для организации иерархических файловых систем. Требуется наличие каталогов, которые сопоставляют имена файлов или каталогов с их физическим описанием. Каталоги представляют собой особый вид файлов, которые хранятся во внешней памяти подобно обычным файлам, но структура которых поддерживается самой файловой системой.

Структура файла–каталога очень проста. Фактически, каталог – это таблица, каждый элемент которой состоит из двух полей: номера i–узла данного файла в его файловой системе и имени файла, которое связано с этим номером (конечно, этот файл может быть и каталогом). Если просмотреть содержимое текущего рабочего каталога с помощью команды ls –ai, то можно получить вывод, который демонстрирует, что в любом каталоге содержатся два стандартных имени – "." и "..". Имени "." сопоставляется i–узел, соответствующий самому этому каталогу, а имени ".." – i–узел, соответствующий "родительскому" каталогу данного каталога.

$ ls –ai

33 .

122 ..

54 first_file

65 second_file

65 second_again

77 dir2

В первом столбце указывается номер i-node, второй столбец – это имя файла.

"Родительским" (parent) каталогом называется каталог, в котором содержится имя данного каталога. Файлы с именами "first_file" и "second_file" – это разные файлы с номерами i–узлов 54 и 65 соответственно. Файл "second_again" представляет пример так называемой жесткой ссылки: он имеет другое имя, но реально описывается тем же i–узлом, что и файл "second_file". Наконец, последний элемент каталога описывает некоторый другой каталог с именем "dir2".

Дескрипторы файлов пронумерованы, начиная с единицы. Номер дескриптора файла хранится в полях элементов каталога.

Каталоги обеспечивают связь между именами файлов и собственно файлами. Элемент каталога длиной 16 байт содержит поле имени файла (14 байт – 14 символов), по которому обеспечивается доступ к файлу, и поле ссылки длиной 2 байта, содержащее номер дескриптора файла.

По номеру дескриптора проводится поиск дескриптора, который содержит адреса блоков данных файла (имя файла  номер дескриптора  данные). Взаимно однозначного соответствия между именем файла и самим файлом нет. Несколько каталогов могут содержать элементы (связи), содержащие в поле имени разные имена, а в поле ссылки соответствующие этим разным именам одинаковые номера. Таким образом, файл может иметь несколько имен и к одним и тем же данным обращение может быть по разным именам.

Это позволяет файловой системе следить за занятостью файла: как только счетчик ссылок станет равным нулю, индексный дескриптор освобождается, а дисковое пространство может быть использовано для записи других файлов. Ссылки на один и тот же файл могут находиться в любом каталоге файловой системы.

Информация о файле, содержащаяся в каталоге, – это единственная связь между именем файла и самим файлом.

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

С точки зрения ядра UNIX траектория, задаваемая полным именем файла, представляет собой переходы между каталогами и индексными дескрипторами. Пусть существует полное имя «../a/b» (рис. 4.3). Для того чтобы проследить эту цепочку, система выполняет следующие действия:

  1. Выбирает индексный дескриптор текущего каталога. Этот дескриптор содержится в контексте процесса.

  2. С помощью информации, хранящейся в этом дескрипторе, осуществляет поиск в текущем каталоге имени «..» и получает номер его дескриптора.

  3. Выбирает индексный дескриптор «..».

  4. С помощью информации, хранящейся в дескрипторе «..», осуществляет поиск в родительском каталоге файла «а» и получает номер его дескриптора.

  5. Выбирает индексный дескриптор «а».

  6. С помощью информации, хранящейся в дескрипторе «а» осуществляет поиск в каталоге «а» файла с именем «b» и получает номер его индексного дескриптора.

  7. Выбирает индексный дескриптор файла «b».

  8. Обращается к файлу «b».

Как видно из примера, самый обычный доступ к файлу требует проведения очень большой работы.

Рис. 4.3. Прослеживание цепочки полного имени