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