Ни setuid, ни setgid не имеют очевидного смысла для каталогов. И setuid действительно не имеет семантики установки для каталогов. Если же для каталога установлен бит setgid, то все новые файлы, созданные в этом каталоге, будут принадлежать к той же группе, которая владеет самим каталогом. Это облегчает применение каталогов для организации совместной работы пользователей.
Sticky-бит — последний значащий бит в разряде модификатора доступа к файлу, имеет интересную историю, связанную с его наименованием. Старые реализации Unix должны были загружать в память всю программу целиком, прежде чем начать выполнять ее. Это означало, что крупные программы отнимали значительное время на запуск, что было довольно-таки неприятно. Если же программа имела установленный sticky-бит, то операционная система пыталась сохранить ее "привязанной" в памяти настолько долго, насколько возможно, даже когда эта программа не запущена, чтобы уменьшить время запуска. Хотя это было немного некрасиво, но работало достаточно хорошо с часто используемыми программами, такими как компилятор С. Современные реализации Unix, включая Linux, используют загрузку по требованию — кусочек за кусочком, что сделало sticky-бит излишним, поэтому Linux игнорирует его для обычных файлов.
Sticky-бит по-прежнему используется для каталогов. Обычно любой пользователь с правами записи в каталог может удалить любой файл в этом каталоге. Однако если sticky-бит каталога установлен, файлы могут быть удалены только пользователем-владельцем либо пользователем root. Такое поведение удобно, если каталог служит репозиторием для файлов, созданных многими пользователями, например, /tmp
.
Последний раздел режима файла указывает тип файла. Он содержится в старших восьмеричных разрядах и не является битовой маской. Вместо этого значение этих разрядов равно специфическому типу файлов (04 означает каталог, 06 — блочное устройство). Тип файла устанавливается при его создании. Он никогда не может быть изменен, кроме как посредством удаления файла.
Включаемый файл
представляет символические константы для всех этих битов доступа, что делает код более читабельным. Пользователи 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. Константы типов файлов