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