ЗАМЕЧАНИЕ. В GNU/Linux эти макросы возвращают 1 для true и 0 для false. Однако, на других системах возможно, что они будут возвращать для true вместо 1 произвольное неотрицательное число. (POSIX определяет лишь ненулевое значение в противоположность нулевому). Поэтому всегда следует использовать эти макросы как автономные тесты вместо проверки возвращаемого значения.

/* Корректное использование */

if (S_ISREG(stbuf.st_mode)) ...

/* Heкорректное использование */

if (S_ISREG(stbuf.st_mode) ==1) ...

Наряду с макросами предоставляет два набора битовых масок. Один набор для проверки прав доступа, а другой - для проверки типа файла. Мы видели маски прав доступа в разделе 4.6 «Создание файлов», когда обсуждали тип mode_t и значения для open() и creat(). Битовые маски, их числовые значения для GNU/Linux и смысл приведены в табл. 5.2.

Таблица 5.2. Битовые маски POSIX для типов файлов и прав доступа в

МаскаЗначениеКомментарий
S_IFMT0170000Маска для битовых полей типа файла
S_IFSOCK0140000Сокет.
S_IFLNK0120000Символическая ссылка
S_IFREG0100000Обычный файл.
S_IFBLK0060000Блочное устройство.
S_IFDIR0040000Каталог.
S_IFCHR0020000Символьное устройство.
S_IFIFO0010000FIFO.
S_ISUID0004000Бит setuid.
S_ISGID0002000Бит setgid
S_ISVTX0001000«Липкий» (sticky) бит.
S_IRWXU0000700Маска для прав доступа владельца.
S_IRUSR0000400Доступ на чтение для владельца.
S_IWUSR0000200Доступ на запись для владельца.
S_IXUSR0000100Доступ на исполнение для владельца.
S_IRWXG0000070Маска для прав доступа группы.
S_IRGRP0000040Доступ на чтение для группы.
S_IWGRP0000020Доступ на запись для группы.
S_IXGRP0000010Доступ на исполнение для группы.
S_IRWXO0000007Маска для прав доступа остальных.
S_IROTH0000004Доступ на чтение для остальных.
S_IWOTH0000002Доступ на запись для остальных.
S_IXOTH0000001Доступ на исполнение для остальных.

Некоторые из этих масок служат цели изолирования различных наборов битов, закодированных в поле st_mode:

• S_IFMT представляет биты 12–15, которыми закодированы различные типы файлов.

• S_IRWXU представляет биты 6–8, являющиеся правами доступа владельца (на чтение, запись, исполнение для User).

• S_IRWXG представляет биты 3–5, являющиеся правами доступа группы (на чтение, запись, исполнение для Group).

• S_IRWXO представляет биты 0–2, являющиеся правами доступа для «остальных» (на чтение, запись, исполнение для Other).

Биты прав доступа и типа файла графически изображены на рис. 5.3.

Рис. 5.3. Биты прав доступа и типа файлов

Маски типов файлов стандартизованы главным образом для совместимости со старым кодом; они не должны использоваться непосредственно, поскольку такой код менее читаем, чем соответствующие макросы. Случается, что макрос реализован с использованием масок: довольно логично, но это не подходит для кода уровня пользователя.

Стандарт POSIX явным образом констатирует; что в будущем не будут стандартизированы новые битовые маски и что тесты для любых дополнительных разновидностей типов файлов, которые могут быть добавлены, будут доступны лишь в виде макросов S_ISxxx().

<p>5.4.4.1. Сведения об устройстве</p>

Стандарт POSIX не определяет значение типа dev_t, поскольку предполагалось его использование на не-Unix системах также, как на Unix-системах. Однако стоит знать, что находится в dev_t.

Когда истинно S_ISBLK(sbuf.st_mode) или S_ISCHR(sbuf.st_mode), сведения об устройстве находятся в поле sbuf.st_rdev. В противном случае это поле не содержит никакой полезной информации.

Перейти на страницу:

Похожие книги