5.7 СОЗДАНИЕ ФАЙЛА
Системная функция open дает
процессу доступ к существующему
файлу, а системная функция creat
создает в системе новый файл.
Синтаксис вызова системной функции
creat:
fd = creat(pathname,modes);
где переменные pathname, modes и fd имеют
тот же смысл, что и в системной
функции open. Если прежде такого
файла не существовало, ядро создает
новый файл с указанным именем и
указанными правами доступа к нему;
если же такой файл уже существовал,
ядро усекает файл (освобождает все
существующие блоки данных и
устанавливает размер файла равным
0) при наличии соответствующих прав
доступа к нему (***). На
Рисунке 5.12 приведен алгоритм
создания файла.
алгоритм creat
входная информация: имя файла
установки прав доступа к файлу
выходная информация: дескриптор файла
{
получить индекс для данного имени файла (алгоритм namei);
если (файл уже существует)
{
если (доступ не разрешен)
{
освободить индекс (алгоритм iput);
возвратить (ошибку);
}
}
в противном случае /* файл еще не существует */
{
назначить свободный индекс из файловой системы (алго-
ритм ialloc);
создать новую точку входа в родительском каталоге:
включить имя нового файла и номер вновь назначенного
индекса;
}
выделить для индекса запись в таблице файлов, инициализи-
ровать счетчик;
если (файл существовал к моменту создания)
освободить все блоки файла (алгоритм free);
снять блокировку (с индекса);
возвратить (пользовательский дескриптор файла);
}
|
Рисунок 5.12.
Алгоритм создания файла
Ядро проводит
синтаксический анализ имени пути
поиска, используя алгоритм namei и
следуя этому алгоритму буквально,
когда речь идет о разборе имен
каталогов. Однако, когда дело
касается последней компоненты
имени пути поиска, а именно
идентификатора создаваемого файла,
namei отмечает смещение в байтах до
первой пустой позиции в каталоге и
запоминает это смещение в
пространстве процесса. Если ядро не
обнаружило в каталоге компоненту
имени пути поиска, оно в конечном
счете впишет имя компоненты в
только что найденную пустую
позицию. Если в каталоге нет пустых
позиций, ядро запоминает смещение
до конца каталога и создает новую
позицию там. Оно также запоминает в
пространстве процесса индекс
просматриваемого каталога и держит
индекс заблокированным; каталог
становится по отношению к новому
файлу родительским каталогом. Ядро
не записывает пока имя нового файла
в каталог, так что в случае
возникновения ошибок ядру
приходится меньше переделывать.
Оно проверяет наличие у процесса
разрешения на запись в каталог.
Поскольку процесс будет
производить запись в каталог в
результате выполнения функции creat,
наличие разрешения на запись в
каталог означает, что процессам
дозволяется создавать файлы в
каталоге.
Предположив, что под
данным именем ранее не
существовало файла, ядро назначает
новому файлу индекс, используя
алгоритм ialloc (раздел 4.6). Затем
оно записывает имя нового файла и
номер вновь выделенного индекса в
родительский каталог, а смещение в
байтах сохраняет в пространстве
процесса. Впоследствии ядро
освобождает индекс родительского
каталога, удерживаемый с того
времени, когда в каталоге
производился поиск имени файла.
Родительский каталог теперь
содержит имя нового файла и его
индекс. Ядро записывает вновь
выделенный индекс на диск (алгоритм
bwrite), прежде чем записать на диск
каталог с новым именем. Если между
операциями записи индекса и
каталога произойдет сбой системы, в
итоге окажется, что выделен индекс,
на который не ссылается ни одно из
имен путей поиска в системе, однако
система будет функционировать
нормально. Если, с другой стороны,
каталог был записан раньше вновь
выделенного индекса и сбой системы
произошел между ними, файловая
система будет содержать имя пути
поиска, ссылающееся на неверный
индекс (более подробно об этом см. в разделе
5.16.1).
Если данный файл уже
существовал до вызова функции creat,
ядро обнаруживает его индекс во
время поиска имени файла. Старый
файл должен позволять процессу
производить запись в него, чтобы
можно было создать "новый"
файл с тем же самым именем, так как
ядро изменяет содержимое файла при
выполнении функции creat: оно усекает
файл, освобождая все
информационные блоки по алгоритму
free, так что файл будет выглядеть как
вновь созданный. Тем не менее,
владелец и права доступа к файлу
остаются прежними: ядро не передает
право собственности на файл
владельцу процесса и игнорирует
права доступа, указанные процессом
в вызове функции. Наконец, ядро не
проверяет наличие разрешения на
запись в каталог, являющийся
родительским для существующего
файла, поскольку оно не меняет
содержимого каталога.
Функция creat продолжает
работу, выполняя тот же алгоритм,
что и функция open. Ядро выделяет
созданному файлу запись в таблице
файлов, чтобы процесс мог читать из
файла, а также запись в таблице
пользовательских дескрипторов
файла, и в конце концов возвращает
указатель на последнюю запись в
виде пользовательского
дескриптора файла.
(***)
Системная функция open имеет два
флага, O_CREAT (создание) и O_TRUNC
(усечение). Если процесс
устанавливает в вызове функции
флаг O_CREAT и файл не существует, ядро
создаст файл. Если файл уже
существует, он не будет усечен, если
только не установлен флаг O_TRUNC.
Предыдущая
глава || Оглавление || Следующая
глава
|