OPEN(2)
НАЗВАНИЕ
open - открыть файл для чтения или записи
СИНТАКСИС
#include <fcntl.h>
int open (path, oflag [, mode])
char *path;
int oflag, mode;
ОПИСАНИЕ
Аргумент path является указателем на маршрутное имя
файла. Системный вызов open открывает дескриптор для
указанного файла и устанавливает флаги статуса файла в
соответствии со значением аргумента oflag. Для файлов,
не являющихся псевдоустройствами [см. intro(2)], значение oflag задается как поразрядное ИЛИ флагов из следующего списка (из первых трех флагов можно установить
только один):
- O_RDONLY
- Открыть только на чтение.
- O_WRONLY
- Открыть только на запись.
- O_RDWR
- Открыть на чтение/запись.
- O_NDELAY
- Этот флаг может воздействовать на последующие операции чтения и записи [см. read(2) и write(2)].
При открытии именованного канала с установленными
флагами O_RDONLY или O_WRONLY:
- Если установлен флаг O_NDELAY, то вызов open
только на чтение завершается без задержки, а
вызов open только для записи отрабатывает с сообщением об ошибке, если в данный момент нет
процесса, открывшего файл для чтения;
- Если не установлен флаг O_NDELAY, то вызов open
только на чтение блокируется, пока какой-либо
процесс не откроет файл для записи, а вызов
open только на запись блокируется, пока какой
либо процесс не откроет файл на чтение.
При открытии файла, ассоциированного с линией связи:
- Если установлен флаг O_NDELAY, то вызов open
завершается без ожидания несущей.
- Если не установлен флаг O_NDELAY, то вызов open
блокируется до появления несущей.
- O_APPEND
- Перед каждой операцией записи устанавливать указатель текущей позиции на конец файла.
- O_SYNC
- При открытии обычного файла этот флаг воздействует
на последующие операции записи. Если флаг установлен, то каждый вызов write(2) ожидает физического
обновления как данных, так и статуса файла.
- O_CREAT
- Если файл существует, то флаг игнорируется. В противном случае идентификаторы владельца и группы
создаваемого файла устанавливаются равными, соответственно, действующим идентификаторам пользователя и группы процесса, а младшие 12 бит значения
режима доступа к файлу устанавливаются равными
значению аргумента mode, модифицированному следующим образом [см. creat(2)]:
- Биты, соответствующие единичным битам маски режима создания файлов текущего процесса [см.
umask(2)], устанавливаются равными 0.
- Бит навязчивости [см. chmod(2)] устанавливается
равным 0.
- O_TRUNC
- Если файл существует, то он опустошается (размер
становится равным 0), а режим доступа и владелец
не изменяются.
- O_EXCL
- Если установлены оба флага O_EXCL и O_CREAT, то
системный вызов open завершается неудачей, если
файл уже существует.
При открытии псевдоустройства значение oflag может задаваться как поразрядное ИЛИ флага O_NDELAY с одним из
флагов O_RDONLY, O_WRONLY или O_RDWR. Другие флаги применительно к псевдоустройствам игнорируются. Флаг
O_NDELAY воздействует на работу драйверов псевдоустройств и некоторые системные вызовы
[см. getmsg(2),
putmsg(2), read(2), write(2)]. Что касается драйверов,
то реализация флага O_NDELAY зависит от устройства.
Некоторые флаги могут быть установлены и после открытия
файла, посредством системного вызова fcntl(2) [см. также fcntl(5)].
Указатель текущей позиции устанавливается на начало
файла.
Новый дескриптор файла остается открытым после выполнения системных вызовов exec(2) [см. fcntl(2)].
Системный вызов open завершается неудачей и дескриптор
указанного файла не открывается, если выполнено хотя бы
одно из следующих условий:
- [EACCES]
- Нет права на поиск для компонента маршрута.
- [EACCES]
- Для указанного файла нет прав на выполнение
операций, задаваемых значением oflag.
- [EAGAIN]
- Файл существует и доступ к нему заблокирован [см. chmod(2)].
- [EEXIST]
- Флаги O_CREAT и O_EXCL установлены и указанный файл существует.
- [EFAULT]
- Аргумент path указывает за пределы отведенного процессу адресного пространства.
- [EINTR]
- Во время выполнения системного вызова перехвачен сигнал.
- [EIO]
- Разрыв связи или ошибка при открытии псевдоустройства.
- [EISDIR]
- Указанный файл является каталогом и открывается на запись или чтение/запись.
- [EMFILE]
- Превышается максимально допустимое количество дескрипторов файлов, открытых одновременно в одном процессе.
- [EMULTIHOP] Компоненты path требуют многократного обращения к удаленным компьютерам.
- [ENFILE]
- Переполнение системной таблицы файлов.
- [ENOENT]
- Флаг O_CREAT не установлен и указанный файл
не существует.
- [ENOLINK]
- Маршрутное имя path указывает на удаленный
компьютер, связи с которым в данный момент
нет.
- [ENOMEM]
- Система не в состоянии выделить память под
дескриптор пересылки.
- [ENOSPC]
- Установлены флаги O_CREAT и O_EXCL и нет
свободных описателей файлов.
- [ENOSR]
- Нет места для потока.
- [ENOTDIR]
- Компонент маршрута не является каталогом.
- [ENXIO]
- Указанный файл является специальным символьным или блочным файлом, а устройство,
ассоциированное с этим специальным файлом,
не существует.
- [ENXIO]
- Установлены флаги O_NDELAY и O_WRONLY, указанный файл является именованным каналом и
нет процесса, открывшего файл для чтения.
- [ENXIO]
- Неудачная попытка выполнить процедуру открытия для модуля или драйвера псевдоустройства.
- [EROFS]
- Указанный файл расположен в файловой системе, доступной только на чтение, а открывается на запись или чтение/запись.
- [ETXTBSY]
- Файл содержит секцию команд, которая в данный момент выполняется.
СМ. ТАКЖЕ
chmod(2), close(2), creat(2), dup(2), fcntl(2),
intro(2), lseek(2), read(2), getmsg(2), putmsg(2),
umask(2), write(2), fcntl(5).
ДИАГНОСТИКА
При успешном завершении результатом служит дескриптор
файла; в случае ошибки возвращается -1, а переменной
errno присваивается код ошибки