Архитектура операционной системы 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 След. >|

Java книги

Контакты: [email protected]