Функции для работы с файловой системой |
Возвращают дескрипторы файла |
Используют алгоритм namei |
Назначают индексы |
Работают с атрибутами файла |
Ввод-вывод из файла |
Работают со структурой файловых систем |
Управление деревьями |
open creat dup pipe close |
open stat creat link chdir chroot chown chmod unlink mknod mount umount |
creat mknod link unlink |
chown chmod stat |
read write lseek |
mount umount |
chdir chown |
Алгоритмы работы с файловой системой на нижнем уровне |
namei iget iput bmap |
ialloc ifree |
alloc free bmap |
Алгоритмы работы с буферами |
getblk brelse bread breada bwrite |
Рисунок 5.1. Функции для работы с файловой системой и их связь с другими алгоритмами
На Рисунке 5.1 показана взаимосвязь между системными функциями и алгоритмами, описанными ранее. Системные функции классифицируются на несколько категорий, хотя некоторые из функций присутствуют более, чем в одной категории:
• Системные функции, возвращающие дескрипторы файлов для использования другими системными функциями;
• Системные функции, использующие алгоритм namei для анализа имени пути поиска;
• Системные функции, назначающие и освобождающие индекс с использованием алгоритмов ialloc и ifree;
• Системные функции, устанавливающие или изменяющие атрибуты файла;
• Системные функции, позволяющие процессу производить ввод-вывод данных с использованием алгоритмов alloc, free и алгоритмов выделения буфера;
• Системные функции, изменяющие структуру файловой системы;
• Системные функции, позволяющие процессу изменять собственное представление о структуре дерева файловой системы.
Вызов системной функции open (открыть файл) — это первый шаг, который должен сделать процесс, чтобы обратиться к данным в файле. Синтаксис вызова функции open:
fd = open(pathname, flags, modes);
где pathname — имя файла, flags указывает режим открытия (например, для чтения или записи), а modes содержит права доступа к файлу в случае, если файл создается. Системная функция open возвращает целое число [14] Все системные функции возвращают в случае неудачного завершения код -1. Код возврата, равный -1, больше не будет упоминаться при рассмотрении синтаксиса вызова системных функций.
, именуемое пользовательским дескриптором файла. Другие операции над файлами, такие как чтение, запись, позиционирование головок чтения-записи, воспроизведение дескриптора файла, установка параметров ввода-вывода, определение статуса файла и закрытие файла, используют значение дескриптора файла, возвращаемое системной функцией open.
Ядро просматривает файловую систему в поисках файла по его имени, используя алгоритм namei (см. Рисунок 5.2). Оно проверяет права на открытие файла после того, как обнаружит копию индекса файла в памяти, и выделяет открываемому файлу запись в таблице файлов. Запись таблицы файлов содержит указатель на индекс открытого файла и поле, в котором хранится смещение в байтах от начала файла до места, откуда предполагается начинать выполнение последующих операций чтения или записи. Ядро сбрасывает это смещение в 0 во время открытия файла, имея в виду, что исходная операция чтения или записи по умолчанию будет производиться с начала файла. С другой стороны, процесс может открыть файл в режиме записи в конец, в этом случае ядро устанавливает значение смещения, равное размеру файла. Ядро выделяет запись в личной (закрытой) таблице в адресном пространстве задачи, выделенном процессу (таблица эта называется таблицей пользовательских дескрипторов файлов), и запоминает указатель на эту запись. Указателем выступает дескриптор файла, возвращаемый пользователю. Запись в таблице пользовательских файлов указывает на запись в глобальной таблице файлов.
алгоритм open
входная информация:
имя файла
режим открытия
права доступа (при создании файла)
выходная информация: дескриптор файла
{
превратить имя файла в идентификатор индекса (алгоритм namei);
if (файл не существует или к нему не разрешен доступ) return
(код ошибки);
выделить для индекса запись в таблице файлов, инициализировать счетчик, смещение;
выделить запись в таблице пользовательских дескрипторов файла, установить указатель на запись в таблице файлов;
if (режим открытия подразумевает усечение файла)
освободить все блоки файла (алгоритм free);
снять блокировку (с индекса); /* индекс заблокирован выше, в алгоритме namei */
Читать дальше