Следующий фрагмент показывает, как создать переменные, представляющие разрешения
-rw-r--r---rwxr-xr-xmode_t rw_mode, rwx_mode;rw_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; /* 0644 */rwx_mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; /* 0755 */Более старый код использовал
S_IREADS_IWRITES_IEXECmode_t rw_mode, rwx_mode;rw_mode = (S_IREAD|S_IWRITE) | (S_IREAD >> 3) | (S_IREAD >> 6); /* 0644 */rwx_mode = (S_IREAD|S_IWRITE|S_IEXEC) | ((S_IREAD|S_IEXEC) >> 3) | ((S_IREAD|S_IEXEC) >> 6); /* 0755 */К сожалению, ни одна из записей не является очень удобной. Современные версии предпочтительнее, поскольку у каждого бита доступа есть собственное имя и меньше вероятность неправильного выполнения побитовых операций.
При изменении прав доступа к файлу для использования доступны биты дополнительных разрешений, показанные в табл. 4.6, но они не должны использоваться при первоначальном создании файла. Возможность включения этих битов широко варьирует между операционными системами. Лучше всего не пробовать; вместо этого следует изменить права доступа к файлу явным образом после его создания. (Изменение прав доступа описано в разделе 5.5.2 «Изменение прав доступа:
chmod()fchmod()Таблица 4.6. Дополнительные символические имена POSIX для режимов доступа к файлам
| Символическое имя | Значение | Смысл |
|---|---|---|
S_ISUID | 04000 | Установить ID пользователя |
S_ISGID | 02000 | Установить ID группы |
S_ISVTX | 01000 | Сохранить текст |
Когда стандартные утилиты создают файлы, они по умолчанию используют права доступа
-rw-rw-rw-umaskдействительные_права = (затребованные_права & (~umask));umaskumask$НОМЕ/.profileumask()#include <sys/types.h> /* POSIX */#include <sys/stat.h> mode_t umask(mode_t mask);Возвращается старое значение
umaskmode_t mask = umask(0); /* получить текущую маску */(void)umask(mask); /* восстановить ее */Вот пример работы
umask$ <b>umask</b> /* Показать текущую маску */0022$ <b>touch newfile</b> /* Создать файл */$ <b>ls -l newfile</b> /* Показать права доступа нового файла */-rw-r--r-- 1 arnold devel 0 Mar 24 15:43 newfile$ <b>umask 0</b> /* Установить пустую маску */$ <b>touch newfile2</b> /* Создать второй файл */$ <b>ls -l newfile2</b> /* Показать права доступа нового файла */-rw-rw-rw- 1 arnold devel 0 Mar 24 15:44 newfile24.6.2. Создание файлов с помощью
creat()Системный вызов
creat()#include <sys/types.h> /* POSIX */#include <sys/stat.h>#include <fcntl.h>int creat(const char *pathname, mode_t mode);Аргумент
modepathname.сumaskerrnoВо всех остальных отношениях дескрипторы файлов, возвращаемые
creat()open()close()int fd, count;/* Проверка ошибок для краткости опущена */fd = creat("/some/new/file", 0666);count = write(fd, "some data\n", 10);(void)close(fd);4.6.3. Возвращаясь к open()
Вы можете вспомнить объявление для
open()int open(const char *pathname, int flags, mode_t mode);Ранее мы сказали, что при открытии файла для простого ввода/вывода мы можем игнорировать аргумент
modecreat()open()mode