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

В этом разделе описаны действия, которые выполняет операционная система при создании, открытии, закрытии или удалении файлов.

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

Для создания файлов различных типов предусмотрены разные функции:

Функция Тип создаваемого файла
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.