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