Системный вызов open

Прототип системного вызова

#include <fcntl.h>

int open(char *path, int flags);
int open(char *path, int flags, int mode);

Описание системного вызова

Системный вызов open предназначен для выполнения операции открытия файла и, в случае ее удачного осуществления, возвращает файловый дескриптор открытого файла (небольшое неотрицательное целое число, которое используется в дальнейшем для других операций с этим файлом).

Параметр path является указателем на строку, содержащую полное или относительное имя файла.
Параметр
flags может принимать одно из следующих трех значений:

O_RDONLY - если над файлом в дальнейшем будут совершаться только операции чтения;
O_WRONLY - если над файлом в дальнейшем будут осуществляться только операции записи;
O_RDWR - если над файлом будут осуществляться и операции чтения, и операции записи.

Каждое из этих значений может быть скомбинировано посредством операции "побитовое или ( | )" с одним или несколькими следующими флагами:

O_CREAT- если файл с указанным именем не существует, он должен быть создан.
O_EXCL - применяется совместно с флагом O_CREAT. При совместном их использовании и существовании файла с указанным именем, открытие файла не производится и констатируется ошибочная ситуация.
O_NDELAY - запрещает перевод процесса в состояние ожидание при выполнении операции открытия и любых последующих операциях над этим файлом.
O_APPEND - при открытии файла и перед выполнением каждой операции записи (если она, конечно, разрешена) указатель текущей позиции в файле устанавливается на конец файла.
O_TRUNC - если файл существует, уменьшить его размер до 0, с сохранением существующих атрибутов файла, кроме, быть может, времен последнего доступа к файлу и его последней модификации.

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

O_SYNC - любая операция записи в файл будет блокироваться (т. е. процесс будет переведен в состояние ожидание) до тех пор, пока записанная информация не будет физически помещена на соответсвующий низлежащий уровень hardware.
O_NOCTTY - если имя файла относится к терминальному устройству, оно не становится управляющим терминалом процесса, даже если до этого процесс не имел управляющего терминала.

Параметр mode устанавливает атрибуты прав доступа различных категорий пользователей к новому файлу при его создании. Он обязателен в том случае, если среди заданных флагов присутствует флаг O_CREAT и может быть опущен в противном случае. Этот параметр задается как сумма следующих восьмеричных значений:

0400  - Разрешено чтение для пользователя, создавшего файл.
0200  - Разрешена запись для пользователя, создавшего файл.
0100  - Разрешено исполнение для пользователя, создавшего файл.
0040  - Разрешено чтение для группы пользователя, создавшего файл.
0020  - Разрешена запись для группы пользователя, создавшего файл.
0010  - Разрешено исполнение для группы пользователя, создавшего файл.
0004  - Разрешено чтение для всех остальных пользователей
0002  - Разрешена запись для всех остальных пользователей
0001  - Разрешено исполнение для всех остальных пользователей

При создании файла реально устанавливаемые права доступа получаются из стандартной комбинации параметра mode и маски создания файлов текущего процесса umask, а именно - они равны mode & ~umask.

При открытии файлов типа FIFO системный вызов имеет некоторые особенности поведения по сравнению с открытием файлов других типов. Если FIFO открывается только для чтения, и не задан флаг O_NDELAY, то процесс, осуществивший системный вызов, блокируется до тех пор, пока какой-либо другой процесс не откроет FIFO на запись. Если флаг O_NDELAY задан, то возвращается значение файлового дескриптора, ассоциированного с FIFO. Если FIFO открывается только для записи, и не задан флаг O_NDELAY, то процесс, осуществивший системный вызов, блокируется до тех пор, пока какой-либо другой процесс не откроет FIFO на чтение. Если флаг O_NDELAY задан, то констатируется возникновение ошибки и возвращается значение -1.

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

Системный вызов возвращает значение файлового дескриптора для открытого файла при нормальном завершении и значение -1 при возникновении ошибки.