O_CREAT | Если файл еще не существует, создать его как обычный файл. |
O_EXCL | Этот флаг должен использоваться только с O_CREAT . Если он указан, то open() дает сбой в случае существования файла. Этот флаг позволяет реализовать простую блокировку, но не надежен при использовании в сетевых файловых системах типа NFS (подробно о блокировке файлов рассказывается в главе 13). |
O_NOCTTY | Открываемый файл не становится управляющим терминалом процесса (см. главу 10). Этот флаг имеет значение только тогда, когда процесс, не имеющий управляющего терминала, открывает устройство tty. Если же он указан в любом другом случае, этот флаг игнорируется. |
O_TRUNC | Если файл уже существует, его содержимое отбрасывается, и его размер устанавливается равным 0. |
O_APPEND | Все операции записи выполняются в конец файла, хотя произвольный доступ по чтению также разрешен. |
O_NONBLOCK | Файл открывается в неблокирующем режиме. Операции с нормальными файлами всегда блокируются, потому что они работают с локальными жесткими дисками, имеющими предсказуемое время отклика, но операции на некоторых типах файлов требуют непредсказуемого времени для завершения. Например, чтение из канала, в котором нет данных, блокирует процесс чтения до тех пор, пока данные в нем не появятся. Если же специфицирован флаг O_NONBLOCK , вызов read() вместо блокирования вернет ноль байт. Файлы, на операции с которыми может понадобиться непредсказуемый объем времени, называются медленными файлами. (O_NDELAY — оригинальное имя O_NONBLOCK , теперь устаревшее.) |
O_SYNC | Обычно ядро перехватывает операции записи и сбрасывает их на физическое устройство тогда, когда это удобно. Хотя такая реализация значительно повышает производительность, появляется также возможность потери данных, чем в том случае, когда они немедленно пишутся на диск. Если при открытии файла указан флаг O_SYNC , то все изменения в файле сохраняются на диске перед тем, как ядро возвращает управления процессу, выполняющему запись. Это очень важно для некоторых приложений, таких как системы управления базами данных, в которых принудительная запись используется для предотвращения повреждения данных в случае сбоя системы. |
Параметр mode
указывает права доступа для файла, если он создается и если он модифицируется текущей установкой umask
процесса. Если не указано O_CREAT
, то mode
игнорируется.
Функция creat()
в точности эквивалентна следующему вызову:
open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode)
Мы не используем creat()
в этой книге, потому что находим функцию open()
более простой для чтения и понимания.
11.2.4. Чтение, запись и перемещение
Хотя есть несколько способов читать и писать файлы, мы обсудим здесь только простейшие из них[42]. Чтение и запись почти идентичны, поэтому рассмотрим их одновременно.
#include