Символическое имя | Значение | Комментарий |
---|---|---|
S_IRWXU | 00700 | Разрешение на чтение, запись и исполнение для владельца |
S_IRUSR | 00400 | Разрешение на чтение для владельца |
S_IREAD | Аналогично S_IRUSR | |
S_IWUSR | 00200 | Разрешение на запись для владельца |
S_IWRITE | Аналогично S_IWUSR | |
S_IXUSR | 00100 | Разрешение на исполнение для владельца. |
S_IEXEC | Аналогично S_IXUSR | |
S_IRWXG | 00070 | Разрешение на чтение, запись и исполнение для группы |
S_IRGRP | 00040 | Разрешение на чтение для группы |
S_IWGRP | 00020 | Разрешение на запись для группы. |
S_IXGRP | 00010 | Разрешение на исполнение для группы |
S_IRWXO | 00007 | Разрешение на чтение, запись и исполнение для остальных. |
S_IROTH | 00004 | Разрешение на чтение для остальных. |
S_IWOTH | 00002 | Разрешение на запись для остальных |
S_IXOTH | 00001 | Разрешение на исполнение для остальных |
Следующий фрагмент показывает, как создать переменные, представляющие разрешения -rw-r--r--
и -rwxr-xr-x
(0644 и 0755 соответственно):
mode_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_IREAD
, S_IWRITE
и S_IEXEC
вместе со сдвигом битов для получения того же результата:
mode_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()
». Значения этих битов обсуждаются в главе 11 «Права доступа и идентификаторы пользователя и группы».)
Таблица 4.6. Дополнительные символические имена POSIX для режимов доступа к файлам
Символическое имя | Значение | Смысл |
---|---|---|
S_ISUID | 04000 | Установить ID пользователя |
S_ISGID | 02000 | Установить ID группы |
S_ISVTX | 01000 | Сохранить текст |
Когда стандартные утилиты создают файлы, они по умолчанию используют права доступа -rw-rw-rw-
(или 0666). Поскольку большинство пользователей предпочитают избегать файлов, в которые может записывать кто угодно, каждый процесс имеет при себе umask
является набором битов допуска, указывающим те биты, которые никогда не должны устанавливаться
действительные_права = (затребованные_права & (~umask));
umask
обычно устанавливается с помощью команды umask
в $НОМЕ/.profile
, когда вы входите в систему. Из программы С она устанавливается с помощью системного вызова umask()
.
#include
#include
Возвращается старое значение umask
. Поэтому для определения текущей маски нужно установить новое значение, а затем восстановить старое (или изменить его при необходимости):
mode_t mask = umask(0); /* получить текущую маску */
(void)umask(mask); /* восстановить ее */
Вот пример работы umask
на уровне оболочки:
$ umask /* Показать текущую маску */
0022