Книга: Архитектура операционной системы UNIX
5.7 СОЗДАНИЕ ФАЙЛА
5.7 СОЗДАНИЕ ФАЙЛА
Системная функция 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, наличие разрешения на запись в каталог означает, что процессам дозволяется создавать файлы в каталоге.
Предположив, что под данным именем ранее не существовало файла, ядро назначает новому файлу индекс, используя алгоритм ialloc (раздел 4.6). Затем оно записывает имя нового файла и номер вновь выделенного индекса в родительский каталог, а смещение в байтах сохраняет в пространстве процесса. Впоследствии ядро освобождает индекс родительского каталога, удерживаемый с того времени, когда в каталоге производился поиск имени файла. Родительский каталог теперь содержит имя нового файла и его индекс. Ядро записывает вновь выделенный индекс на диск (алгоритм bwrite), прежде чем записать на диск каталог с новым именем. Если между операциями записи индекса и каталога произойдет сбой системы, в итоге окажется, что выделен индекс, на который не ссылается ни одно из имен путей поиска в системе, однако система будет функционировать нормально. Если, с другой стороны, каталог был записан раньше вновь выделенного индекса и сбой системы произошел между ними, файловая система будет содержать имя пути поиска, ссылающееся на неверный индекс (более подробно об этом см. в разделе 5.16.1).
Если данный файл уже существовал до вызова функции creat, ядро обнаруживает его индекс во время поиска имени файла. Старый файл должен позволять процессу производить запись в него, чтобы можно было создать «новый» файл с тем же самым именем, так как ядро изменяет содержимое файла при выполнении функции creat: оно усекает файл, освобождая все информационные блоки по алгоритму free, так что файл будет выглядеть как вновь созданный. Тем не менее, владелец и права доступа к файлу остаются прежними: ядро не передает право собственности на файл владельцу процесса и игнорирует права доступа, указанные процессом в вызове функции. Наконец, ядро не проверяет наличие разрешения на запись в каталог, являющийся родительским для существующего файла, поскольку оно не меняет содержимого каталога.
Функция creat продолжает работу, выполняя тот же алгоритм, что и функция open. Ядро выделяет созданному файлу запись в таблице файлов, чтобы процесс мог читать из файла, а также запись в таблице пользовательских дескрипторов файла, и в конце концов возвращает указатель на последнюю запись в виде пользовательского дескриптора файла.)
- 5.1 OPEN
- 5.2 READ
- 5.3 WRIТЕ
- 5.4 ЗАХВАТ ФАЙЛА И ЗАПИСИ
- 5.5 УКАЗАНИЕ МЕСТА В ФАЙЛЕ, ГДЕ БУДЕТ ВЫПОЛНЯТЬСЯ ВВОД-ВЫВОД — LSEEК
- 5.6 CLOSЕ
- 5.7 СОЗДАНИЕ ФАЙЛА
- 5.8 СОЗДАНИЕ СПЕЦИАЛЬНЫХ ФАЙЛОВ
- 5.9 СМЕНА ТЕКУЩЕГО И КОРНЕВОГО КАТАЛОГА
- 5.10 CМЕНА ВЛАДЕЛЬЦА И РЕЖИМА ДОСТУПА К ФАЙЛУ
- 5.11 STAT И FSTАТ
- 5.12 КАНАЛЫ
- 5.13 DUР
- 5.14 МОНТИРОВАНИЕ И ДЕМОНТИРОВАНИЕ ФАЙЛОВЫХ СИСТЕМ
- 5.15 LINК
- 5.16 UNLINК
- 5.17 АБСТРАКТНЫЕ ОБРАЩЕНИЯ К ФАЙЛОВЫМ СИСТЕМАМ
- 5.18 СОПРОВОЖДЕНИЕ ФАЙЛОВОЙ СИСТЕМЫ
- 5.19 ВЫВОДЫ
- 5.20 УПРАЖНЕНИЯ
- Создание файлов с блокировкой
- Создание многофайловой базы данных
- Создание ярлыков в специальных папках
- Создание и открытие файла
- Практическая работа 59. Создание новой учетной записи и изучение действующих разграничений доступа к файлам
- Создание файла манифеста JAR
- Создание макета файла DateArc.wsc с помощью Windows Script Component Wizard (JScript)
- Создание нового WS-файла
- 7.2. Создание, открытие, печать и иные действия с графическими файлами
- Пример 17-1. dummyfile: Создание 2-х строчного файла-заготовки
- Листинг 10.5. (temp-file.c) Безопасное создание временного файла
- Создание FIFO-файла