open(), open64()

Открыть файл

Прототип:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open( const char *path,
int oflag,
... );
int open64( const char *path,
int oflag,
... );

Аргументы:

path
Путь открываемого файла.
oflag
Флаги для указания статуса и режима доступа к файлу.
mode
При установке бита O_CREAT в oflag необходимо также задать значение для данного аргумента. В качестве значения необходимо задать объект типа mode_t, в котором указан режим доступа, используемый при создании файла. Для дополнительной информации смотрите struct stat.

Библиотека:

libc

Описание:

Функции open() и open64() открывают файл, расположенный в path, создают файловое описание, ссылающееся на файл, и файловый дескриптор, ссылающийся на файловое описание. Флаги статуса и режима доступа к открываемому файловому дескриптору устанавливаются в зависимости от значения аргумента oflag.


Note: Эти функции игнорируют любые рекомендательные блокировки, установленные с помощью fcntl().

Созданный файловый дескриптор является новым и, следовательно, не используется совместно с каким-либо другим процессом в системе.

Значение аргумента oflag задаётся с помощью побитового ИЛИ из значений ниже, определённых в заголовочном файле <fcntl.h>. Необходимо обязательно передать аргументом oflag один из первых трёх флагов режимов доступа:

O_RDONLY
Открыть файл только для чтения.
O_RDWR
Открыть файл для чтения и записи. Открытие FIFO-файла для чтения и записи не поддерживается.
O_WRONLY
Открыть файл только для записи.

Вы также можете указать любую комбинацию нижеприведённых флагов в значении аргумента oflag:

O_APPEND
При использовании данного флага смещение устанавливается в конец файла перед каждой записью.
O_CLOEXEC
Закрыть файловый дескриптор при exec*().
O_CREAT
Использование данного флага требует наличия третьего аргумента, mode, который имеет тип mode_t. Если файл существует, флаг не действует, за исключением комбинации, когда добавлен флаг O_EXCL, как указано ниже.

Иначе файл создаётся; UID файла получает значение эффективного UID процесса; GID файла получает значение эффективного GID процесса или GID директории, в которой создаётся файл (смотрите chmod()).

Флаги разрешений, определённые в <sys/stat.h>, добавляются в значение аргумента mode, за исключением флагов, предназначенных для создания файлового режима процесса (для дополнительной информации смотрите umask()). Флаги, установленные mode, не являющиеся флагами разрешений для файла (т.е. флаги типа файла) игнорируются. Аргумент mode не оказывает влияния на открытие файла для чтения, записи, чтения-записи.
O_DSYNC
Влияет на последующие I/O вызовы; каждый вызов write() будет ожидать, пока все данные будут успешно переданы запоминающему устройству, чтобы файл был читаемым при любом последующем открытии файла (даже после сбоя системы) при отсутствии сбоя запоминающего устройства. Если физический носитель реализует не "сквозную" политику работы с кэшем, тогда отказ системы может быть интерпретирован как отказ запоминающего устройства, и данные могут оказаться недоступными для чтения даже при установке данного флага и при успешном вызове write().
O_EXCL
При одновременном использовании флагов O_EXCL и O_CREAT open() завершается ошибкой в случае, если файл существует. Проверка существования файла и создание файла - атомарные операции, другой процесс, пытающийся выполнить данную операцию с таким же путём к файлу получит ошибку. Установка флага O_EXCL без O_CREAT не оказывает влияния на работу функции.
O_LARGEFILE
Разрешить 64-битные значения смещения внутри файла.
O_NOCTTY
Если флаг установлен и в path указано терминальное устройство, функция open() не вызовет данное терминальное устройство в качестве управляющего терминала для процесса.
O_NONBLOCK
O_REALIDS
Использовать реальный UID/GID для проверки разрешений.
O_RSYNC
I/O операции чтения с использованием файлового дескриптора завершатся на том же уровне целостности, как указано флагами O_DSYNC и O_SYNC.
O_SYNC
Данный флаг влияет на I/O вызовы. Каждый вызов read() или write() завершается только после того, как данные были успешно переданы (и для чтения, и для записи) и вся информация файловой системы, относящаяся к данной операции ввода-вывода (включая информацию о том, как получить данные) успешно передана, включая обновлённое время доступа к файлу, и т.д. Смотрите разбор успешной передачи данных в описании флага O_DSYNC выше.
O_TRUNC
Если файл существует, является регулярным и успешно открывается с режимом доступа O_WRONLY или O_RDWR, длина файла будет уменьшена до нуля, режим и владелец сохранятся. O_TRUNC не влияет на FIFO-файл, блочное устройство, символьное устройство и директории. Использование O_TRUNC совместно с O_RDONLY не имеет эффекта.

Наибольшее значение, которое может быть корректно представлено как объект типа off_t, должно быть установлено в качестве максимального смещения в описании открытого файла.

Возвращаемое значение:

Неотрицательное целочисленное значение, представляющее собой неиспользуемый файловый дескриптор с наименьшим номером. В файле с возможностью поиска смещение устанавливается в начало файла.

Если возникла ошибка, функция возвращает -1, а код ошибки записывается в errno.


Note: В ЗОСРВ «Нейтрино» возвращаемый файловый дескриптор совпадает с идентификатором соединения (или coid) использующимся специфичными функциями Нейтрино.

Коды ошибок:

EACCES
Поиск запрещён в одном из компонентов пути поиска path; файл существует, но доступ в соответствии с oflag запрещён; файл не существует и отсутствуют права на запись в родительскую директорию.
EBADFSYS
Во время попытки открыть файл были обнаружены повреждения. Системный сбой, автоматическое восстановление после которого невозможно, возник во время записи файла или обновления директории. Необходимо выполнить дополнительные действия для исправления ошибки.
EBUSY
В доступе к файлу отказано из-за конфликтующего открытия (смотрите sopen()).
EEXIST
Флаги O_CREAT и O_EXCL установлены, при этом указанный файл существует.
EINTR
Выполнение функции open() было прервано сигналом.
EINVAL
Запрашиваемый режим синхронизации (O_SYNC, O_DSYNC, O_RSYNC) не поддерживается.
EISDIR
Указанный файл является директорией, а аргумент mode определяет доступ только для чтения или чтения/записи.
ELOOP
Слишком большой уровень символических ссылок или префиксов.
EMFILE
В данный момент процесс использует слишком много файловых дескрипторов.
ENAMETOOLONG
Длина строки path превышает PATH_MAX или часть пути к файлу длиннее, чем NAME_MAX.
ENFILE
В данный момент в системе открыто слишком много файлов.
ENOENT
Флаг O_CREAT не установлен, а указанного в path файла не существует; флаг O_CREAT установлен, но часть префикса аргумента path не существует; аргумент path указывает на пустую строку.
ENOSPC
Директория или файловая система, в которой будет располагаться новый файл, не может быть расширена.
ENOSYS
Функция open() не реализована для файловой системы, в которой находится filename.
ENOTDIR
Часть префикса filename не является директорией.
ENXIO
Флаг O_NONBLOCK установлен, файл по указанному пути является FIFO-файлом, флаг O_WRONLY установлен, не найден процесс, открывший этот же файл для чтения, либо устройство, ассоциированное с файлом, было удалено (например CD, floppy).
EOVERFLOW
Указанный файл является обычным, и его размер не может быть корректно представлен в объекте типа off_t.
EROFS
Указанный файл находится в файловой системе, доступной только для чтения, а в аргументе oflag установлена комбинация из флагов: O_WRONLY, O_RDWR, O_CREAT (если файла не существует), O_TRUNC.

Примеры:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main( void )
{
int fd;
/* open a file for output */
/* replace existing file if it exists */
/* with read/write perms for owner */
fd = open( "myfile.dat", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR );
/* read a file that is assumed to exist */
fd = open( "myfile.dat", O_RDONLY );
/* append to the end of an existing file */
/* write a new file if file doesn't exist */
/* with full read/write permissions */
fd = open( "myfile.dat", O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR |
S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH );
return (EXIT_SUCCESS);
}

Классификация:

open() — POSIX 1003.1; open64() — Поддержка больших файлов

Безопасность использования
Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Предостережения:

Функция open() включает расширения POSIX 1003.1-1996 и ЗОСРВ «Нейтрино».

Тематические ссылки:

chmod(), close(), creat(), dup(), dup2(), errno, fcntl(), fstat(), lseek(), read(), write()




Предыдущий раздел: Описание API системной библиотеки