Внутри программы флаги индексного дескриптора можно извлечь и изменить с помощью операций ioctl() FS_IOC_GETFLAGS и FS_IOC_SETFLAGS. (Эти константы определены в файле
int attr;
if (ioctl(fd, FS_IOC_GETFLAGS, &attr) == -1) /* Извлечь текущие флаги */
errExit("ioctl");
attr |= FS_NOATIME_FL;
if (ioctl(fd, FS_IOC_SETFLAGS, &attr) == -1) /* Обновить флаги */
errExit("ioctl");
Для изменения флагов индексного дескриптора файла необходимо, чтобы действующий UID для процесса соответствовал идентификатору пользователя (владельца) файла, либо чтобы процесс был привилегированным (CAP_FOWNER). (Если говорить абсолютно точно, то в Linux для непривилегированного процесса идентификатор пользователя в файловой системе процесса, а не его действующий UID должен совпадать с идентификатором пользователя файла, как сказано в разделе 9.5.)
Системный вызов stat() извлекает информацию о файле (метаданные), основная часть которой берется из индексного дескриптора файла. К ней относятся сведения о принадлежности файла, о правах доступа к нему, а также метки времени.
Программа может обновить время последнего доступа к файлу и время его последнего изменения, выполнив системные вызовы utime(), utimes() или другие подобные интерфейсы.
Каждый файл имеет относящиеся к нему идентификаторы пользователя (владельца) и группы, а также набор битов прав доступа. Для организации прав доступа пользователи файла распределены по трем категориям:
Для файлов и каталогов задействуют три дополнительных бита прав доступа. Биты set-user-ID и set-group-ID можно применить к программным файлам, чтобы создать программы, которые вызывают появление у выполняющегося процесса привилегий, отличающихся от привилегий программного файла за счет присвоения другого идентификатора пользователя или группы. Для каталогов, расположенных в файловых системах, смонтированных с параметром nogrpid (sysvgroups), бит set-group-ID можно использовать для контроля над тем, откуда будут наследовать GID новые файлы, создаваемые в данном каталоге: от действующего GID для процесса или же от GID для родительского каталога. Применительно к каталогам бит закрепления действует как флаг, запрещающий удаление.
Флаги индексного дескриптора управляют различными вариантами поведения файлов и каталогов. Несмотря на то что изначально они были определены для файловой системы ext2, теперь эти флаги поддерживаются и в некоторых других системах.
15.1. Раздел 15.4 содержит несколько утверждений о правах доступа, необходимых для различных операций в файловой системе. Воспользуйтесь командами оболочки или напишите программы, чтобы проверить или получить ответ на следующее:
1) при удалении всех прав доступа владельца к файлу такой файл не разрешает доступ для владельца, хотя у группы и у остальных пользователей доступ все же сохраняется;
2) в каталоге, для которого есть разрешение на чтение, но нет разрешения на выполнение, можно вывести имена файлов, однако к самим файлам доступа нет вне зависимости от прав, назначенных им;
3) какие права доступа необходимы для родительского каталога и для самого файла, чтобы иметь возможность создать новый файл, открыть файл для чтения, открыть файл для записи или удалить файл? Какие права доступа необходимы для исходного и целевого каталогов при переименовании файла? Если при переименовании уже существует целевой файл, какие права доступа необходимы для него? Как установка закрепляющего бита (chmod +t) для каталога повлияет на операции переименования и удаления?
15.2. Как вы думаете, изменится ли какая-либо из трех меток времени файла после выполнения системного вызова stat()? Если нет, объясните почему.
15.3. На компьютере, работающем под Linux 2.6, измените программу, приведенную в листинге 15.1 (t_stat.c) так, чтобы метки времени файла отображались с наносекундной точностью.
15.4. Системный вызов access() проверяет права доступа, используя реальные идентификаторы пользователя и группы для процесса. Напишите соответствующую функцию, которая выполняет такие проверки на основе действующих UID и GID для процесса.