Sticky-бит по-прежнему используется для каталогов. Обычно любой пользователь с правами записи в каталог может удалить любой файл в этом каталоге. Однако если sticky-бит каталога установлен, файлы могут быть удалены только пользователем-владельцем либо пользователем root. Такое поведение удобно, если каталог служит репозиторием для файлов, созданных многими пользователями, например, /tmp.
Последний раздел режима файла указывает тип файла. Он содержится в старших восьмеричных разрядах и не является битовой маской. Вместо этого значение этих разрядов равно специфическому типу файлов (04 означает каталог, 06 — блочное устройство). Тип файла устанавливается при его создании. Он никогда не может быть изменен, кроме как посредством удаления файла.
Включаемый файл <sys/stat.h> представляет символические константы для всех этих битов доступа, что делает код более читабельным. Пользователи Unix и Linux обычно чувствуют себя увереннее с восьмеричными представлениями режимов файла, поэтому обычно в программах используются восьмеричные представления непосредственно. В табл. 11.1 перечислены символические имена прав и модификаторов доступа к файлам.
Таблица 11.1. Константы прав доступа к файлам
Имя Значение Описание S_ISUID 0004000 Программа является setuid-программой. S_ISGID 0002000 Программа является setgid-программой. S_ISVTX 0001000 Sticky-бит. S_IRWXU 00700 Владелец файла имеет права на чтение, запись и выполнение. S_IRUSR 00400 Владелец файла имеет права на чтение. S_IWUSR 00200 Владелец файла имеет права на запись. S_IXUSR 00100 Владелец файла имеет права на выполнение. S_IRWXG 00070 Группа файла имеет права на чтение, запись и выполнение. S_IRGRP 00040 Группа файла имеет права на чтение. S_IWGRP 00020 Группа файла имеет права на запись. S_IXGRP 00010 Группа файла имеет права на выполнение. S_IRWXO 00007 Прочие пользователи имеют права на чтение, запись и выполнение. S_IROTH 00004 Прочие пользователи имеют права на чтение. S_IWOTH 00002 Прочие пользователи имеют права на запись. S_IXOTH 00001 Прочие пользователи имеют права на выполнение.
11.1.3. Типы файлов
Старшие четыре бита режима файла указывают тип файла. В табл. 11.2 перечислены константы, имеющие отношение к типам файлов. Объединение с помощью битовой операции "И" любых этих констант с режимом файла порождает ненулевое значение, если бит установлен.
Таблица 11.2. Константы типов файлов
Имя Значение (восьмеричное) Описание S_IFMT 00170000 Это значение, побитно объединенное с режимом с помощью операции "И", дает тип файла (который эквивалентен одному из остальных значений S_IF). S_IFSOCK 0140000 Файл является сокетом. S_IFLNK 0120000 Файл является символической ссылкой. S_IFREG 0100000 Файл является обычным файлом. S_IFBLK 0060000 Файл представляет блочное устройство. S_IFDIR 0040000 Файл является каталогом. S_IFCHR 0020000 Файл представляет символьное устройство. S_IFIFO 0010000 Файл представляет коммуникационный канал "первый вошел — первый вышел".
Описанные ниже макросы принимают в качестве аргумента режим файла и возвращают true или false.
S_ISLINK(m) Истинно, если файл является символической ссылкой. S_ISREC(m) Истинно, если файл является обычным файлом. S_ISDIR(m) Истинно, если файл является каталогом. S_ISCHR(m) Истинно, если файл представляет символьное устройство. S_ISBLK(m) Истинно, если файл представляет блоковым устройство. S_ISFIFO(m) Истинно, если файл является каналом "первый вошел — первый вышел" S_ISSOCK(m) Истинно, если файл является сокетом.
11.1.4. Маска umask процесса
Права доступа, назначаемые вновь созданным файлам, зависят как от настроек системы, так и от предпочтений конкретного пользователя. Чтобы помочь индивидуальным программам, которые нуждаются в предположениях об использовании файла, система дает возможность пользователям отключить отдельные привилегии для вновь создаваемых файлов (и каталогов, которые являются специальными файлами). Каждый процесс имеет маску umask, определяющую отключенные биты привилегий для создания файлов. Это позволяет процессу специфицировать достаточно либеральные права (обычно это касается общих прав на чтение и запись) и обеспечивать права, которые пользователь предпочитает. Если определенный файл особо важен, процесс создания может включать назначение более ограниченных прав, чем обычно, потому что umask никогда не влияет на менее строгие ограничения прав, а только на более строгие.
Текущая установка umask для процесса выполняется системным вызовом umask().
#include <sys/stat.h>
int umask(int newmask);
Возвращается старое значение и устанавливается новое значение umask процесса. Для файла могут быть указаны только права на чтение, запись и исполнение — вы не можете использовать umask для запрещения установки setuid, setgid или sticky-бита. Команда umask представлена в большинстве командных процессоров и позволяет пользователю устанавливать umask для самой командной оболочки и всех его последующих дочерних процессов.
В качестве примера, команда touch создает новые файлы с правами 0666 (общие права на чтение и запись). Так как пользователю подобное редко подходит, он может заставить команду touch отключать общие и групповые права записи для файла с помощью команды umask 022, как показано ниже.
$ umask 022
$ touch foo
$ ls -l foo
-rw-r--r-- 1 ewt ewt 0 Feb 24 21:24 foo
Если он предпочитает давать права на запись группе, то может вместо этого назначит umask 002.
$ umask 002
$ touch foo
$ ls -l foo