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:

  1. Если установлен флаг O_NDELAY, то вызов open только на чтение завершается без задержки, а вызов open только для записи отрабатывает с сообщением об ошибке, если в данный момент нет процесса, открывшего файл для чтения;
  2. Если не установлен флаг O_NDELAY, то вызов open только на чтение блокируется, пока какой-либо процесс не откроет файл для записи, а вызов open только на запись блокируется, пока какой либо процесс не откроет файл на чтение.
При открытии файла, ассоциированного с линией связи:
  1. Если установлен флаг O_NDELAY, то вызов open завершается без ожидания несущей.
  2. Если не установлен флаг O_NDELAY, то вызов open блокируется до появления несущей.
O_APPEND
Перед каждой операцией записи устанавливать указатель текущей позиции на конец файла.
O_SYNC
При открытии обычного файла этот флаг воздействует на последующие операции записи. Если флаг установлен, то каждый вызов write(2) ожидает физического обновления как данных, так и статуса файла.
O_CREAT
Если файл существует, то флаг игнорируется. В противном случае идентификаторы владельца и группы создаваемого файла устанавливаются равными, соответственно, действующим идентификаторам пользователя и группы процесса, а младшие 12 бит значения режима доступа к файлу устанавливаются равными значению аргумента mode, модифицированному следующим образом [см. creat(2)]:
  1. Биты, соответствующие единичным битам маски режима создания файлов текущего процесса [см. umask(2)], устанавливаются равными 0.
  2. Бит навязчивости [см. 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 присваивается код ошибки