Имя открываемого файла или устройства передается как параметр path; параметр oflagsприменяется для указания действий, предпринимаемых при открытии файла.
Параметр oflagsзадается как комбинация обязательного режима доступа к файлу и других необязательных режимов. Системный вызов openдолжен задавать один из режимов доступа к файлу, указанных в табл. 3.1.
Таблица 3.1
| Режим |
Описание |
О_RDONLY |
Открытие только для чтения |
О_WRONLY |
Открытие только для записи |
O_RDWR |
Открытие для чтения и записи |
Вызов может также включать в параметр oflagsкомбинацию (с помощью побитовой операции OR) следующих необязательных режимов:
□ O_APPEND— помещает записываемые данные в конец файла;
□ O_TRUNC— задает нулевую длину файла, отбрасывая существующее содержимое;
□ O_CREAT— при необходимости создает файл с правами доступа, заданными в параметре mode;
□ O_EXCL— применяется с режимом O_CREAT, который гарантирует, что вызывающая программа создаст файл. Вызов openатомарный, т.е. он выполняется только одним вызовом функции. Это предотвращает одновременное создание файла двумя программами. Если файл уже существует, openзавершится неудачно.
Другие возможные значения параметра oflagsописаны на странице интерактивного справочного руководства, посвященной open; ее можно найти в разделе 2 руководства (примените команду man 2 open).
Вызов openвозвращает новый дескриптор файла (всегда неотрицательное целое) в случае успешного завершения или -1 в случае неудачи, в последнем случае open также задает глобальную переменную errno,чтобы показать причину неудачи. Мы рассмотрим errnoболее подробно в одном из последующих разделов. У нового дескриптора файла всегда наименьший неиспользованный номер дескриптора, свойство, которое может оказаться очень полезным в некоторых обстоятельствах. Например, если программа закрывает свой стандартный вывод, а затем снова вызывает open, будет повторно использован дескриптор файла с номером 1 и стандартный вывод будет успешно перенаправлен в другой файл или на другое устройство.
Существует также системный вызов creat, стандартизованный POSIX, но он применяется не часто. Он не только создает файл, как можно ожидать; но также и открывает его. Такой вызов эквивалентен вызову openс параметром oflags, равным O_CREAT|О_WRONLY|O_TRUNC.
Количество файлов, одновременно открытых в любой выполняющейся программе, ограничено. Предельное значение обычно определяется константой OPEN_MAXв файле limits.h и меняется от системы к системе, но стандарт POSIX требует, чтобы оно было не меньше 16. Это значение само по себе может быть ограничено в соответствии с предельными значениями локальной системы, поскольку программа не сможет всегда иметь возможность держать открытыми такое количество файлов. В ОС Linux это предельное значение можно изменять во время выполнения и поэтому OPEN_MAXуже не константа. Как правило, ее начальное значение равно 256.
Когда вы создаете файл, применяя флаг O_CREATв системном вызове open, вы должны использовать форму с тремя параметрами. Третий параметр modeформируется из флагов, определенных в заголовочном файле sys/stat.h и соединенных поразрядной операцией OR. К ним относятся:
□ S_IRUSR— право на чтение, владелец;
□ S_IWUSR— право на запись, владелец;
□ S_IXUSR— право на выполнение, владелец;
□ S_IRGRP— право на чтение, группа;
□ S_IWGRP— право на запись, группа;
□ S_IXGRP— право на выполнение, группа;
□ S_IROTH— право на чтение, остальные;
□ S_IWOTH— право на запись, остальные;
□ S_IXOTH— право на выполнение, остальные.
Например, вызов
open("myfile", O_CREAT, S_IRUSR|S_IXOTH);
в результате приведет к созданию файла с именем myfile с правом на чтение для владельца и правом на выполнение для остальных и только с этими правами доступа.
$ ls -ls myfile
0 -r-------х 1 neil software 0 Sep 22 08:11 myfile*
Есть пара факторов, способных повлиять на права доступа к файлу. Во-первых, заданные права применяются, только если файл создается. Во-вторых, на права доступа к созданному файлу оказывает воздействие маска пользователя (заданная командой командной оболочки, umask). Значение параметра mode, заданное в вызове open, на этапе выполнения объединяется с помощью операции ANDс инвертированной маской пользователя. Например, если заданы маска пользователя 001 и в параметре modeфлаг S_IXOTH, у созданного файла не будет права на выполнение для "остальных", т.к. маска пользователя указывает на то, что это право не должно предоставляться. Флаги в вызовах openи creatявляются на самом деле запросами на установку прав доступа. Будут ли предоставлены запрошенные права, зависит от значения umaskво время выполнения.
Читать дальше