Вызов 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
во время выполнения.
umask
— это системная переменная, содержащая маску для прав доступа к файлу, которые будут применяться при создании файла. Вы можете изменить значение переменной, выполнив команду umask
, предоставляющую новое значение. Значение этой переменной представляет собой трёхзнаковое восьмеричное число. Каждая цифра — результат объединения с помощью операций OR
значений 1, 2 или 4 (табл. 3.2). Отдельные цифры указывают на права доступа "пользователя", "группы" и "остальных" соответственно.