Выбрать главу

• O_CREAT — создание нового, пустого файла, если такого файла еще не существует. Этот флаг срабатывает, даже если файл открывается только для чтения. Если указывается O_CREAT, то при вызове open() нужно также обязательно предоставлять аргумент mode. В противном случае права доступа к новому файлу будут установлены по какому-либо произвольному значению, взятому из стека.

• O_DIRECT — разрешение файловому вводу-выводу обходить буферный кэш. Это свойство рассматривается в разделе 13.6. Чтобы сделать определение этой константы доступным из <fcntl.h>, должен быть задан макрос проверки возможностей _GNU_SOURCE.

• O_DIRECTORY — возвращение ошибки (в этом случае errno присваивается значение ENOTDIR), если путевое имя не является каталогом. Этот флаг представляет собой расширение, разработанное главным образом для реализации opendir() (см. раздел 18.8). Чтобы сделать определение этой константы доступным из <fcntl.h>, должен быть задан макрос проверки возможностей _GNU_SOURCE.

• O_DSYNC (с выходом Linux 2.6.33) — выполнение записи в файл в соответствии с требованиями соблюдения целостности данных при синхронизированном вводе-выводе. Обратите внимание на буферизацию ввода-вывода на уровне ядра, рассматриваемую в разделе 13.3.

• O_EXCL — используется в сочетании с флагом O_CREAT как указание, что файл, если он уже существует, не должен быть открыт. Вместо этого системный вызов open() не выполняется, а errno присваивается значение EEXIST. Иными словами, флаг позволяет вызывающему коду убедиться в том, что это и есть процесс, создающий файл. Проверка существования и создание файла выполняются в атомарном режиме. Понятие атомарности рассматривается в разделе 5.1. Когда в качестве флагов указаны и O_CREAT, и O_EXCL, системный вызов open() не выполняется (с ошибкой EEXIST), если путевое имя является символьной ссылкой. Такое поведение в SUSv3 требуется, чтобы привилегированные приложения могли создавать файл в определенном месте и при этом исключалась возможность создания файла в другом месте с использованием символьной ссылки (например, в системном каталоге), которая негативно скажется на безопасности.

• O_LARGEFILE — открытие файла в режиме поддержки больших файлов. Этот флаг применяется в 32-разрядных системах для работы с большими файлами. Хотя флаг O_LARGEFILE в SUSv3 не указан, его можно найти в некоторых других реализациях UNIX. В 64-разрядных реализациях Linux, таких как Alpha и IA-64, этот флаг работать не будет. Дополнительные сведения о нем даются в разделе 5.10.

• O_NOATIME (с выходом Linux 2.6.8) — отказ от обновления времени последнего обращения к файлу (поле st_atime рассматривается в разделе 15.1) при чтении из файла. Чтобы можно было воспользоваться этим флагом, действующий идентификатор пользователя вызывающего процесса должен соответствовать владельцу файла или же процесс должен быть привилегированным (CAP_FOWNER). В противном случае системный вызов open() не будет выполнен и будет выдана ошибка EPERM. (В действительности, как указывается в разделе 9.5, для непривилегированного процесса речь идет о пользовательском идентификаторе файловой системы, а не о его действующем ID пользователя. Именно он должен совпадать с идентификатором пользователя файла при открытии этого файла с флагом O_NOATIME.) Флаг относится к нестандартным расширениям Linux. Для предоставления его определения из <fcntl.h> следует задать макрос проверки возможностей _GNU_SOURCE. Флаг O_NOATIME предназначен для использования программами индексации и создания резервных копий. Его применение может существенно сократить объем активного использования диска, поскольку не потребуются многочисленные перемещения вперед и назад по диску для чтения содержимого файла, а также обновления времени последнего обращения к файлу в индексном дескрипторе (см. раздел 14.4). Функциональные возможности, похожие на обеспечиваемые флагом O_NOATIME, доступны при использовании флагов MS_NOATIME и FS_NOATIME_FL (см. раздел 15.5) во время системного вызова mount() (см. подраздел 14.8.1).

• O_NOCTTY — предотвращение превращения открываемого файла в управляющий терминал, если он является терминальным устройством. Управляющие терминалы рассматриваются в разделе 34.4. Если открываемый файл не является терминалом, флаг не работает.