Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Низкоуровневый доступ к файлам.doc
Скачиваний:
2
Добавлен:
20.09.2019
Размер:
156.16 Кб
Скачать

Исходные права доступа

Когда создается файл с применением флага 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 с правом на чтение для владельца и правом на выполнение для остальных и только с этими правами доступа.

Есть пара факторов, способных повлиять на права доступа к файлу. Во-первых, заданные права применяются, только если файл создается. Во-вторых, на права доступа к созданному файлу оказывает воздействие маска пользователя (заданная командой командной оболочки, umask). Значение параметра mode, заданное в вызове open, на этапе выполнения объединяется с помощью операции AND с инвертированной маской пользователя. Например, если заданы маска пользователя 001 и в параметре mode флаг S_IXOTH, у созданного файла не будет права на выполнение для "остальных", т.к. маска пользователя указывает на то, что это право не должно предоставляться.

Флаги в вызовах open и creat являются на самом деле запросами на установку прав доступа. Будут ли предоставлены запрошенные права, зависит от значения umask во время выполнения.

Umask

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

Таблица 2

Цифра

Значение

Смысл

1

0

Никакие права пользователя не отвергнуты

4

Право пользователя на чтение отвергается

2

Право пользователя на запись отвергается

1

Право пользователя на выполнение отвергается

2

0

Никакие права группы не отвергнуты

4

Право группы на чтение отвергается

2

Право группы на запись отвергается

1

Право группы на выполнение отвергается

3

0

Никакие права остальных не отвергнуты

4

Право остальных на чтение отвергается

2

Право остальных на запись отвергается

1

Право остальных на выполнение отвергается

Close

Системный вызов close применяется для разрыва связи файлового дескриптора fildes с его файлом. Дескриптор файла после этого может использоваться повторно. Вызов возвращает 0 в случае успешного завершения и -1 при возникновении ошибки.

#include <unistd.h>

int close (int fildes);

В некоторых случаях проверка возвращаемого значения вызова close бывает очень важна. Некоторые файловые системы, особенно с сетевой структурой, могут не сообщать об ошибке записи в файл до тех пор, пока файл не будет закрыт, потому что при выполнении записи могло отсутствовать подтверждение действительной записи данных.

Приведем пример программы копирования файла с использованием системных вызовов open, write и read:

#include <unistd.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdlib.h>