• 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. Для предоставления его определения из
• O_NOCTTY — предотвращение превращения открываемого файла в управляющий терминал, если он является терминальным устройством. Управляющие терминалы рассматриваются в разделе 34.4. Если открываемый файл не является терминалом, флаг не работает.
• O_NOFOLLOW — обычно системный вызов open() разыменовывает символьную ссылку. Но, если задан флаг O_NOFOLLOW и аргумент pathname является символьной ссылкой, вызов open() не выполняется (в errno заносится значение ELOOP). Этот флаг особенно пригодится в привилегированных программах, чтобы обеспечить отказ от разыменования символьной ссылки при системном вызове open(). Для предоставления определения этого флага из
• O_NONBLOCK — открытие файла в неблокируемом режиме (см. раздел 5.9).
• O_SYNC — открытие файла для синхронизированного ввода-вывода. Обратите внимание на буферизацию ввода-вывода на уровне ядра, рассматриваемую в разделе 13.3.
• O_TRUNC — усечение файла до нулевой длины с удалением любых существующих данных, если файл уже существует и является обычным. В Linux усечение происходит, когда файл открывается для чтения или для записи (в обоих случаях нужны права доступа к файлу для записи). В SUSv3 сочетание флагов O_RDONLY и O_TRUNC не оговорено техническими условиями, но большинство других реализаций UNIX ведут себя так же, как и Linux.
4.3.2. Ошибки, возвращаемые из системного вызова open()
В случае возникновения ошибки при попытке открытия файла системный вызов open() возвращает –1, а в errno идентифицируется причина ошибки. Далее перечислены возможные ошибки, которые могут произойти (вдобавок к тем, что уже были упомянуты при описании только что рассмотренного аргумента flags).
• EACCES — права доступа к файлу не позволяют вызывающему процессу открыть файл в режиме, указанном флагами. Из-за прав доступа к каталогу доступ к файлу невозможен или файл не существует и не может быть создан.
• EISDIR — указанный файл является каталогом, а вызывающий процесс пытается открыть его для записи. Это запрещено. (С другой стороны, есть случаи, когда может быть полезно открыть каталог для чтения. Пример будет рассмотрен в разделе 18.11.)
• EMFILE — достигнуто ограничение ресурса процесса на количество файловых дескрипторов (RLIMIT_NOFILE, рассматривается в разделе 36.3).