В листинге 4.2 показаны примеры использования open(). В некоторых из них указываются дополнительные биты флагов, которые вскоре будут рассмотрены.
Листинг 4.2. Примеры использования open()
/* Открытие существующего файла для чтения */
fd = open("startup", O_RDONLY);
if (fd == -1)
errExit("open");
/* Открытие нового или существующего файла для чтения и записи с усечением до нуля
байтов; предоставление владельцу исключительных прав доступа на чтение и запись */
fd = open("myfile", O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (fd == -1)
errExit("open");
/* Открытие нового или существующего файла для записи; записываемые данные
должны всегда добавляться в конец файла */
fd = open("w.log", O_WRONLY | O_CREAT | O_APPEND,
S_IRUSR | S_IWUSR);
if (fd == -1)
errExit("open");
В SUSv3 определяется, что при успешном завершении системного вызова open() гарантируется, что процессу будет выделен наименьший неиспользуемый дескриптор файл. Этим можно воспользоваться, чтобы быть уверенными, что файл открыт с конкретным дескриптором файла. Например, следующая последовательность дает уверенность в том, что файл открывается с использованием дескриптора стандартного ввода (нулевой файловый дескриптор).
if (close(STDIN_FILENO) == -1) /* Закрытие нулевого файлового дескриптора */
errExit("close");
fd = open(pathname, O_RDONLY);
if (fd == -1)
errExit("open");
Поскольку дескриптор файла 0 не используется, open() гарантирует открытие файла с этим дескриптором. В разделе 5.5 показывается применение для получения аналогичного результата вызовов dup2() и fcntl(), но с более гибким управлением дескриптором файла. В этом разделе также приводится пример того, как можно извлечь пользу от управления файловым дескриптором, с которым открывается файл.
4.3.1. Аргумент flags системного вызова open()
В некоторых примерах вызова open(), показанных в листинге 4.2, во флаги, кроме режима доступа к файлу, включены дополнительные биты (O_CREAT, O_TRUNC и O_APPEND). Рассмотрим аргумент flags более подробно. В табл. 4.3 приведен полный набор констант, любая комбинация которых с помощью побитового ИЛИ (|), может быть передана в аргументе flags. В последнем столбце показано, какие из этих констант были включены в стандарт SUSv3 или SUSv4.
Таблица 4.3. Значения для аргументов флагов системного вызова open()
Флаг — Назначение — SUS?
O_RDONLY — Открытие только для чтения — v3
O_WRONLY — Открытие только для записи — v3
O_RDWR — Открытие для чтения и записи — v3
O_CLOEXEC — Установка флага закрытия при выполнении (close-on-exec) (начиная с версии Linux 2.6.23) — v4
O_CREAT — Создание файла, если он еще не существует — v3
O_DIRECTORY — Отказ, если аргумент pathname указывает не на каталог — v4
O_EXCL — С флагом O_CREAT: исключительное создание файла — v3
O_LARGEFILE — Используется в 32-разрядных системах для открытия больших файлов -
O_NOCTTY — Pathname запрещено становиться управляющим терминалом данного процесса — v3
O_NOFOLLOW — Запрет на разыменование символьных ссылок — v4
O_TRUNC — Усечение существующего файла до нулевой длины — v3
O_APPEND — Записи добавляются исключительно в конец файла — v3
O_ASYNC — Генерация сигнала, когда возможен ввод/вывод —
O_DIRECT — Операции ввода-вывода осуществляются без использования кэша —
O_DSYNC — Синхронизированный ввод-вывод с обеспечением целостности данных (начиная с версии Linux 2.6.33) — v3
O_NOATIME — Запрет на обновление времени последнего доступа к файлу при чтении с помощью системного вызова read() (начиная с версии Linux 2.6.8) -
O_NONBLOCK — Открытие в неблокируемом режиме — v3
O_SYNC — Ведение записи в файл в синхронном режиме — v3
Константы в табл. 4.3 разделяются на следующие группы.
•