Создание и удаление файлов
В этом разделе описаны действия, которые выполняет операционная система при создании, открытии, закрытии или удалении файлов.
Создание файла
Для создания файлов различных типов предусмотрены разные функции:
| Функция | Тип создаваемого файла |
|---|---|
| creat | Обычный |
| open | Обычный (если установлен флаг O_CREAT) |
| mknod | Обычный, FIFO или специальный |
| mkfifo | Именованный канал (FIFO) |
| pipe | Неименованный канал |
| socket | Сокеты |
| mkdir | Каталоги |
| symlink | Символьная связь |
Создание обычного файла (функции creat, open и mknod)
Функция creat создает файл с указанными именем и режимом доступа. Если файл с таким Именем уже существует, и у процесса есть права на запись в него, то функция creat усекает файл. В результате освобождаются все блоки данных, а размер файла обнуляется. Обычный файл можно создать и с помощью функции open с флагом O_CREAT.
Функции creat, mkfifo и mknod создают файлы с правами доступа, заданными в параметре Режим. При создании обычного файла с помощью функции open права доступа задаются в параметре Режим флага O_CREAT. Функция umask устанавливает маску прав доступа, предоставляемых при создании файлов, и позволяет получить предыдущее значение маски.
Права доступа к новому файлу вычисляются путем побитового умножения величины, обратной umask, на права доступа, указанные процессом при создании файла. Во время создания файла процессом операционная система выполняет следующие действия:
- Определяет права доступа процесса, создающего файл.
- Получает значение umask.
- Вычисляет значение, обратное umask.
- Умножает права доступа на значение umask.
Создание особого файла (функции mknod и mkfifo)
Для создания специальных файлов применяются функции mknod и mkfifo. Функция mknod позволяет создать именованный канал (FIFO), обычный файл или файл устройства. Она создает такой же i-узел, как и функция creat. При создании файла с помощью функции mknod тип этого файла указывается в соответствующем параметре. При создании блочного или символьного файла устройства в i-узел записывается информация о главном и дополнительном устройствах.
Функция mkfifo служит интерфейсом для функции mknod и применяется для создания именованных каналов.
Открытие файла
Для обращения к ранее созданному файлу применяется функция open. Она возвращает дескриптор файла. Этот дескриптор применяется функциями чтения, записи, поиска, копирования, установки параметров ввода-вывода, определения состояния файла и закрытия файла. При выделении дескриптора файла функция open создает запись в таблице дескрипторов файлов.
Функция open выполняет следующие действия:
- Проверяет, есть ли у процесса права доступа к файлу.
- Выделяет для открытого файла запись в таблице дескрипторов файлов. Функция open устанавливает указатель чтения/записи в начало файла.
Функции ioctl и ioctlx предназначены для управления специальными файлами устройств.
Закрытие файла
Для удаления записи о ненужном файле из таблицы дескрипторов файлов применяется функция close. Если в таблице дескрипторов существует несколько ссылок на файл, то значение счетчика уменьшается на 1. Если существует только одна ссылка на файл, то запись таблицы освобождается. Обращение к файлу, дескриптор которого освобожден, приведет к ошибке, если только его дескриптор не был повторно связан с файлом с помощью функции open. При завершении процесса ядро закрывает все дескрипторы файлов, открытые и не освобожденные процессом. Это гарантирует, что к моменту завершения процесса все файлы будут закрыты.
Удаление файла
Если файл больше не нужен, его можно удалить с помощью функции unlink . Если на один и тот же файл указывает несколько жестких ссылок, функция unlink позволяет удалить указанную ссылку. Если существует только одна ссылка, функция unlink удаляет сам файл. Дополнительная информация приведена в описании функции unlink.