- •Глава 7. Файловые системы
- •7.1. Иерархическая модель файловой системы
- •7.2. Логическая организация файлов. Интерфейсы
- •7.3. Логическая файловая система. Каталоги
- •7.4. Логическая файловая система. Системные вызовы
- •7.5. Базовая файловая система Дескриптор файла
- •Управление доступом
- •7.6. Физическая структура файлов
- •7.7. Пример
- •7.8. Целостность данных и файловой системы
- •7.9. Загружаемая файловая система
- •Контрольные вопросы
7.4. Логическая файловая система. Системные вызовы
В API ФС зачастую трудно установить, к какой части ФС адресован тот или иной системный вызов, так как большинство вызовов проходят обработку на всех уровнях ФС. Тем не менее, большинство системных вызовов мы рассматриваем именно вместе с логической ФС, так как существенной составляющей этих вызовов является именно работа с каталогами. Не следует, однако, забывать, что даже если функции вызова ограничиваются только работой с каталогом, для его выполнения тоже требуется обращение к нижним уровням иерархии ФС, так как каталог – это тоже файл, который имеет свою физическую структуру и который тоже надо читать и записывать.
Для рассмотрения мы разобьем все системные вызовы на следующие группы:
вызовы, работающие с каталогами;
вызовы, работающие с файлами;
вызовы, работающие с томами.
Вызовы, работающие с каталогами
Установить рабочий (текущий) каталог:
setCurrentDirectory(dirName)
При помощи этого вызова процесс сообщает ОС, какой каталог является для него рабочим. В дальнейшем допустимы обращения к файлам в этом каталоге по локальным именам. В ходе своего выполнения процесс может неоднократно менять свой рабочий каталог. Имя каталога dirName задается в виде символьной строки, содержащей путь, отправной точкой которого может быть либо корневой каталог, либо – текущий. Логическая ФС (совместно с нижними уровнями ФС) обеспечивает движение по этому пути. В API ОС может быть включен также информационный вызов getCurrentDirectory, возвращающий полное имя текущего каталога.
Создать подкаталог:
createDirectory(dirName)
При помощи этого вызова процесс может создать новый подкаталог. Обычно имя каталога dirName задается локальным и новый подкаталог создается в текущем каталоге, но может быть допущено и задание полного имени. Этот вызов может рассматриваться как специальный случай вызова createFile.
Удалить подкаталог:
removeDirectory(dirName)
Конструктор ОС должен особо определить реакцию системы на применение этого вызова к непустому каталогу: то ли завершать в этом случае вызов с ошибкой, то ли удалять каталог со всем его содержимым.
Вызовы, работающие с файлами
Создать файл:
createFile(fileName, parameters)
Вызов создает новый физический файл в текущем каталоге, если имя задано в локальной форме или в другом - если задано полное имя. Другие параметры – parameters – задают атрибуты, заносимые в дескриптор создаваемого файла.
Создать алиас:
createAlias(fileName, aliaseName)
Вызов создает новый элемент каталога, ссылающийся на тот же дескриптор физического файла.
Создать косвенный файл:
createIndirect(fileName, indirectName)
Вызов создает новый элемент каталога, ссылающийся на старый элемент каталога.
Удалить файл:
deleteFile(fileName)
Вызов удаляет элемент каталога, соответствующий заданному имени. Если имя является именем косвенного файла или если у файла имеются альтернативные имена, то удаляется только элемент каталога, в противном случае уничтожаются также и физический файл, и его дескриптор.
Переместить файл:
moveFile(oldName, newName )
Вызов перемещает файл в другой каталог. Одно из имен может быть локальным (то есть исходный или целевой каталог может быть текущим), другое – обязательно должно быть полным. Данная операция не требует перемещения физического файла или его дескриптора, а только элемента каталога. Вызов может быть реализован как комбинация двух вызовов, описанных выше: createAlias – в новом каталоге и deleteFile – в старом. Как частный случай этого вызова может рассматриваться вызов renameFile – переименовать файл, но в целях повышения эффективности его реализация может быть выполнена путем исправления данных в элементе каталога, остающемся на том же месте.
Копировать файл:
copyFile(oldName, newName )
Вызов копирует файл в другой каталог или в тот же каталог под новым именем. В отличие от вызова moveFile копируется физический файл – данные файла и файловый дескриптор, а для копии создается новый элемент каталога. Далее старый файл и копия существуют независимо друг от друга.
Вызовы, работающие с томами.
Монтировать том:
mount(entrName, extName)
Вызов подключает к ФС новый том. entrName задает идентификацию тома в ФС – это логическое имя тома или имя подкаталога, которым представляется том в едином дереве каталогов. extName идентифицирует том вне ФС – это может быть адрес устройства, на котором том установлен, сетевой адрес узла при удаленном доступе и т.п.
Снять том:
unMount (entrName )
Вызов отключает от ФС ранее монтированный том.