Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Не вдаваясь в подробности, скажем, что вызов

open
устанавливает путь к файлу или устройству. Если установка прошла успешно, он возвращает дескриптор файла, который может применяться в системных вызовах
read
,
write
и др. Дескриптор файла уникален и не используется совместно другими процессами, которые могут в данный момент выполняться. Если файл открыт одновременно в двух программах, они поддерживают отдельные дескрипторы файла. Если они обе пишут в файл, то продолжат запись с того места, где остановились. Их данные не чередуются, но данные одной программы могут быть записаны поверх данных другой. У каждой программы свое представление о том, какая порция файла (каково смещение текущей позиции в файле) прочитана или записана. Вы можете помешать нежелательным накладкам такого сорта с помощью блокировки файла, которая будет обсуждаться в главе 7.

Имя открываемого файла или устройства передается как параметр

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
во время выполнения.

umask

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

Таблица 3.2

Цифра Значение Смысл
1 0 Никакие права пользователя не отвергнуты
4 Право пользователя на чтение отвергается
2 Право пользователя на запись отвергается
1 Право пользователя на выполнение отвергается
2 0 Никакие права группы не отвергнуты
4 Право группы на чтение отвергается
2 Право группы на запись отвергается
1 Право группы на выполнение отвергается
3 0 Никакие права остальных не отвергнуты
4 Право остальных на чтение отвергается
2 Право остальных на запись отвергается
1 Право остальных на выполнение отвергается
Поделиться:
Популярные книги

Шатун. Лесной гамбит

Трофимов Ерофей
2. Шатун
Фантастика:
боевая фантастика
7.43
рейтинг книги
Шатун. Лесной гамбит

Медиум

Злобин Михаил
1. О чем молчат могилы
Фантастика:
фэнтези
7.90
рейтинг книги
Медиум

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Боярышня Евдокия

Меллер Юлия Викторовна
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Евдокия

Дитя прибоя

Трофимов Ерофей
Дитя прибоя
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Дитя прибоя

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Воплощение Похоти

Некрасов Игорь
1. Воплощение Похоти
Фантастика:
юмористическое фэнтези
попаданцы
рпг
аниме
5.00
рейтинг книги
Воплощение Похоти

Звездная Кровь. Экзарх III

Рокотов Алексей
3. Экзарх
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Экзарх III

Железный Воин Империи II

Зот Бакалавр
2. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Железный Воин Империи II

Я граф. Книга XII

Дрейк Сириус
12. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я граф. Книга XII

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Старшеклассник без клана. Апелляция кибер аутсайдера 2

Афанасьев Семен
2. Старшеклассник без клана. Апелляция аутсайдера
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Старшеклассник без клана. Апелляция кибер аутсайдера 2