Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
146 из 715
алгоритм open
входная информация:
имя файла
режим открытия
права доступа (при создании файла)
выходная информация: дескриптор файла
{
превратить имя файла в идентификатор индекса (алгоритм namei);
if (файл не существует или к нему не разрешен доступ) return (код ошибки);
выделить для индекса запись в таблице файлов, инициализировать счетчик, смещение;
выделить запись в таблице пользовательских дескрипторов файла, установить указатель на запись в таблице файлов;
if (режим открытия подразумевает усечение файла) освободить все блоки файла (алгоритм free);
снять блокировку (с индекса); /* индекс заблокирован выше, в алгоритме namei */
return (пользовательский дескриптор файла);
}
Рисунок 5.2. Алгоритм открытия файла
Предположим, что процесс, открывая файл «/etc/passwd» дважды, один раз только для чтения и один раз только для записи, и однажды файл «local» для чтения и для записи [15] , выполняет следующий набор операторов:
fd1 = open("/etc/passwd", O_RDONLY);
fd2 = open("local", O_RDWR);
fd3 = open("/etc/passwd", O_WRONLY);
На Рисунке 5.3 показана взаимосвязь между таблицей индексов, таблицей файлов и таблицей пользовательских дескрипторов файла. Каждый вызов функции open возвращает процессу дескриптор файла, а соответствующая запись в таблице пользовательских дескрипторов файла указывает на уникальную запись в таблице файлов ядра, пусть даже один и тот же файл ("/etc/passwd") открывается дважды. Записи в таблице файлов для всех экземпляров одного и того же открытого файла указывают на одну запись в таблице индексов, хранящихся в памяти. Процесс может обращаться к файлу «/etc/passwd» с чтением или записью, но только через дескрипторы файла, имеющие значения 3 и 5 (см. Рисунок). Ядро запоминает разрешение на чтение или запись в файл в строке таблицы файлов, выделенной во время выполнения функции open.
|< Пред. 144 145 146 147 148 След. >|