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. Ядро выделяет созданному файлу запись в таблице файлов, чтобы процесс мог читать из файла, а также запись в таблице пользовательских дескрипторов файла, и в конце концов возвращает указатель на последнюю запись в виде пользовательского дескриптора файла.)

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Создание файла /etc/fstab

Из книги Linux From Scratch автора Бикманс Герард

Создание файла /etc/fstab Система должна знать о разделах, которые есть в системе и о порядке их монтирования. Все разделы и порядок их монтирования перечисляется в файле /etc/fstab. Создадим такой файл /etc/fstab содержащий следующее:cat > /etc/fstab << «EOF»# Begin /etc/fstab# filesystem mount-point fs-type options


5.7 СОЗДАНИЕ ФАЙЛА

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

5.7 СОЗДАНИЕ ФАЙЛА Системная функция open дает процессу доступ к существующему файлу, а системная функция creat создает в системе новый файл. Синтаксис вызова системной функции creat:fd = creat(pathname, modes);где переменные pathname, modes и fd имеют тот же смысл, что и в системной функции open. Если


Создание файла *.resources

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Создание файла *.resources Имея файл *.resx, вы можете использовать утилиту resgen.exe, чтобы сгенерировать двоичный эквивалент этого файла. Для этого откройте окно командной строки Visual Studio 2005, перейдите в корневой каталог вашего диска C и выполните следующую команду.resgen resxform.resx


4.10. Создание раздела (файла) подкачки

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

4.10. Создание раздела (файла) подкачки Рано или поздно при работе с Linux вам станет недостаточно оперативной памяти: потребности растут, а возможности (оперативная память) остаются прежними. В этом случае нужно купить дополнительные 128...256 Мб, тем более, что цены на память


Создание нового файла шаблона

Из книги Создание шаблонов Joomla автора Автор неизвестен

Создание нового файла шаблона Для активации расширения необходимо перезапустить Dreamweaver. Создайте новый документ динамического типа (Dynamic page type). Для этого в главном меню выберите Файл | Новый | Динамическая страница | PHP (File | New | Dynamic Page | PHP) Рис. 12: Настройка нового документа


Создание нового WS-файла

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

Создание нового WS-файла Как и в случае обычного одиночного сценария, новый WS-файл создается с помощью пункта меню File|New, однако в диалоговом окне New нужно выбрать вкладку Workspaces, где представлены несколько мастеров для создания файлов различных типов (рис. П3.5). Рис. П3.5.


Создание и открытие файла

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Создание и открытие файла Поскольку данная функция является первой из функций Windows, к изучению которых мы приступаем, ее описание будет несколько более подробным по сравнению с остальными; для других функций часто будут приводиться лишь краткие описания. Вместе с тем,


Создание входного файла

Из книги OrCAD PSpice. Анализ электрических цепей автора Кеоун Дж.

Создание входного файла Откройте программу pspice.exe (рис. В.3) и выберите позиции меню File, New, Text File, как показано на рис. В.4. Рис. B.3. Пиктограммы на рабочем столе PSpice Рис. В.4. Создание текстового файла на PSpiceПоявится пустое окно с мигающим курсором, позволяющее ввести текст.


Создание cab-файла

Из книги Программирование КПК и смартфонов на .NET Compact Framework автора Климов Александр П.

Создание cab-файла Прежде чем установочный пакет попадет в руки пользователя, нужно хорошенько поработать над его созданием. Устройства под управлением Windows Mobile не могут напрямую работать с файлами .msi. Вместо этого используются кабинетные файлы с расширением .cab. Таким


4.2.2. Создание файла и папки

Из книги Первые шаги с Windows 7. Руководство для начинающих автора Колисниченко Денис Н.

4.2.2. Создание файла и папки Мы уже научились просматривать содержимое папок. Теперь научимся создавать файлы. Проще всего создать файл в какой-то программе, например, в текстовом процессоре. Для этого обычно используется команда меню Файл | Новый или Файл | Создать. После


Создание копии работающего файла

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Создание копии работающего файла В этот момент gbak не может выполнить резервное копирование базы данных, содержащей разрушенные данные. Поскольку вы имеете исключительный доступ, выполните копирование средствами файловой системы (а не с помощью gbak) файла базы данных. В


10.7. Создание файла сценария

Из книги Цифровая фотография. Трюки и эффекты автора Гурский Юрий Анатольевич

10.7. Создание файла сценария Конечно, ввод многострочных команд в режиме командной строки не слишком удобен и чреват ошибками, поэтому лучше всего размещать такие команды в файлах сценариев. Кроме того, в сценариях допускается наличие пустых строк и комментариев, что


13.4. Создание файла .logout

Из книги автора

13.4. Создание файла .logout Одним из недостатков интерпретатора Bourne shell является отсутствие в нем файла .logout. Этот файл содержит команды, которые требуется выполнить непосредственно перед завершением сеанса работы в системе, т. е. до выполнения командыexit.Однако собственный


19.7. Создание файла функций

Из книги автора

19.7. Создание файла функций А теперь создадим файл функций, включающий одну функцию. Эта функция будет загружена интерпретатором команд, протестирована, изменена, а затем повторно загружена.Создаваемый файл функций functions.main будет содержать следующий код:$ pg functions.main#!/bin/sh#


8.4. Создание файла

Из книги автора

8.4. Создание файла Запустите Photoshop. Выполните команду File ? New (Файл ? Новый). Лучше сразу, с первого дня работы в программе, учиться выполнять команды с помощью клавиатурных сокращений, поэтому можно нажать Ctrl+N.В окне New (Новый) (рис. 8.10) пользователь задает необходимые