Книга: Разработка приложений в среде Linux. Второе издание
11.2.3. Открытие файлов в файловой системе
11.2.3. Открытие файлов в файловой системе
Хотя Linux предусматривает множество типов файлов, обычные файлы используются наиболее часто. Программы, конфигурационные файлы, файлы данных — все они подпадают под это определение, и многие приложения не могут (явно) использовать файлы любых других типов. Есть два способа открытия файла, который имеет ассоциированное с ним имя.
#include <fcntl.h>
#include <unistd.h>
int open(char *pathname, int flags, mode_t mode);
int creat(char *pathname, mode_t mode);
Функция open()
возвращает файловый дескриптор, указывающий на pathname
. Если возвращенное значение меньше нуля, значит, произошла ошибка (как всегда, errno
содержит код ошибки). Аргумент flags
описывает тип доступа, который нужен вызывающему процессу, а также управляет различными атрибутами открытия и манипулирования файлом. Режим доступа всегда должен быть указан, и он может быть одним из следующих: O_RDONLY
, O_RDWR
либо O_WRONLY
, что запрашивает доступ, соответственно, только по чтению, по чтению и записи либо только по записи. С этим режимом может быть объединены логическим "И" следующие значения для управления прочей семантикой файлов.
O_CREAT |
Если файл еще не существует, создать его как обычный файл. |
O_EXCL |
Этот флаг должен использоваться только с O_CREAT . Если он указан, то open() дает сбой в случае существования файла. Этот флаг позволяет реализовать простую блокировку, но не надежен при использовании в сетевых файловых системах типа NFS (подробно о блокировке файлов рассказывается в главе 13). |
O_NOCTTY |
Открываемый файл не становится управляющим терминалом процесса (см. главу 10). Этот флаг имеет значение только тогда, когда процесс, не имеющий управляющего терминала, открывает устройство tty. Если же он указан в любом другом случае, этот флаг игнорируется. |
O_TRUNC |
Если файл уже существует, его содержимое отбрасывается, и его размер устанавливается равным 0. |
O_APPEND |
Все операции записи выполняются в конец файла, хотя произвольный доступ по чтению также разрешен. |
O_NONBLOCK |
Файл открывается в неблокирующем режиме. Операции с нормальными файлами всегда блокируются, потому что они работают с локальными жесткими дисками, имеющими предсказуемое время отклика, но операции на некоторых типах файлов требуют непредсказуемого времени для завершения. Например, чтение из канала, в котором нет данных, блокирует процесс чтения до тех пор, пока данные в нем не появятся. Если же специфицирован флаг O_NONBLOCK , вызов read() вместо блокирования вернет ноль байт. Файлы, на операции с которыми может понадобиться непредсказуемый объем времени, называются медленными файлами. (Примечание. O_NDELAY — оригинальное имя O_NONBLOCK , теперь устаревшее.) |
O_SYNC |
Обычно ядро перехватывает операции записи и сбрасывает их на физическое устройство тогда, когда это удобно. Хотя такая реализация значительно повышает производительность, появляется также возможность потери данных, чем в том случае, когда они немедленно пишутся на диск. Если при открытии файла указан флаг O_SYNC , то все изменения в файле сохраняются на диске перед тем, как ядро возвращает управления процессу, выполняющему запись. Это очень важно для некоторых приложений, таких как системы управления базами данных, в которых принудительная запись используется для предотвращения повреждения данных в случае сбоя системы. |
Параметр mode
указывает права доступа для файла, если он создается и если он модифицируется текущей установкой umask
процесса. Если не указано O_CREAT
, то mode
игнорируется.
Функция creat()
в точности эквивалентна следующему вызову:
open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode)
Мы не используем creat()
в этой книге, потому что находим функцию open()
более простой для чтения и понимания.
- 11.2. Основные файловые операции
- Открытие и редактирование документов
- Открытие файлов
- Резервное копирование многофайловых баз данных
- Восстановление из резервных копий многофайловых баз данных
- Восстановление из резервной копии на системе-приемнике
- Создание файлов с блокировкой
- Рекомендуемое расширение для файлов баз данных - *.ib
- 5.12.2 Открытие поименованного канала
- Создание многофайловой базы данных
- Глава 5. Разработка и анализ бизнес-планов в системе Project Expert
- Правила именования файлов