Читаем Архитектура операционной системы UNIX полностью

На Рисунке 5.11, например, показаны записи из таблиц, приведенных на Рисунке 5.4, после того, как второй процесс закрывает соответствующие им файлы. Записи, соответствующие дескрипторам 3 и 4 в таблице пользовательских дескрипторов файлов, пусты. Счетчики в записях таблицы файлов теперь имеют значение 0, а сами записи пусты. Счетчики ссылок на файлы «/etc/passwd» и «private» в индексах также уменьшились. Индекс для файла «private» находится в списке свободных индексов, поскольку счетчик ссылок на него равен 0, но запись о нем не пуста. Если еще какой-нибудь процесс обратится к файлу «private», пока индекс еще находится в списке свободных индексов, ядро востребует индекс обратно, как показано в разделе 4.1.2.

Рисунок 5.11. Таблицы после закрытия файла

<p id="_6_7">5.7 СОЗДАНИЕ ФАЙЛА</p>

Системная функция open дает процессу доступ к существующему файлу, а системная функция creat создает в системе новый файл. Синтаксис вызова системной функции creat:

fd = creat(pathname, modes);

где переменные pathname, modes и fd имеют тот же смысл, что и в системной функции open. Если прежде такого файла не существовало, ядро создает новый файл с указанным именем и указанными правами доступа к нему; если же такой файл уже существовал, ядро усекает файл (освобождает все существующие блоки данных и устанавливает размер файла равным 0) при наличии соответствующих прав доступа к нему[16]. На Рисунке 5.12 приведен алгоритм создания файла.

алгоритм creat

входная информация:

 имя файла

 установки прав доступа к файлу

выходная информация: дескриптор файла

{

 получить индекс для данного имени файла (алгоритм namei);

 if (файл уже существует) {

  if (доступ не разрешен) {

   освободить индекс (алгоритм iput);

   return (ошибку);

  }

 }

 else { /* файл еще не существует */

  назначить свободный индекс из файловой системы (алгоритм ialloc);

  создать новую точку входа в родительском каталоге;

  включить имя нового файла и номер вновь назначенного индекса;

 }

 выделить для индекса запись в таблице файлов, инициализировать счетчик;

 if (файл существовал к моменту создания) освободить все блоки файла (алгоритм free);

 снять блокировку (с индекса);

 return (пользовательский дескриптор файла);

}

Рисунок 5.12. Алгоритм создания файла

Ядро проводит синтаксический анализ имени пути поиска, используя алгоритм namei и следуя этому алгоритму буквально, когда речь идет о разборе имен каталогов. Однако, когда дело касается последней компоненты имени пути поиска, а именно идентификатора создаваемого файла, namei отмечает смещение в байтах до первой пустой позиции в каталоге и запоминает это смещение в пространстве процесса. Если ядро не обнаружило в каталоге компоненту имени пути поиска, оно в конечном счете впишет имя компоненты в только что найденную пустую позицию. Если в каталоге нет пустых позиций, ядро запоминает смещение до конца каталога и создает новую позицию там. Оно также запоминает в пространстве процесса индекс просматриваемого каталога и держит индекс заблокированным; каталог становится по отношению к новому файлу родительским каталогом. Ядро не записывает пока имя нового файла в каталог, так что в случае возникновения ошибок ядру приходится меньше переделывать. Оно проверяет наличие у процесса разрешения на запись в каталог. Поскольку процесс будет производить запись в каталог в результате выполнения функции creat, наличие разрешения на запись в каталог означает, что процессам дозволяется создавать файлы в каталоге.

Перейти на страницу:

Все книги серии Серия книг по программному обеспечению издательства prentice hall

Похожие книги