5.4.4. Определение типа файла

5.4.4. Определение типа файла

Вспомните, что в поле st_mode закодированы как тип файла, так и права доступа к нему. <sys/stat.h> определяет ряд макросов, которые определяют тип файла. В частности, эти макросы возвращают true или false при использовании с полем st_mode. У каждого описанного ранее типа файла есть свой макрос. Предположим, выполняется следующий код:

struct stat stbuf;

char filename[PATH_МАХ]; /* PATH_MAX из <limits.h> */

/* ... поместить имя файла в filename ... */

if (stat(filename, &stbuf) < 0) {

 /* обработать ошибку */

}

Когда система заполнила stbuf, можно вызывать следующие макросы, причем в качестве аргумента передается stbuf.st_mode:

S_ISREG(stbuf.st_mode)

Возвращает true, если filename является обычным файлом.

S_ISDIR(stbuf.st_mode)

Возвращает true, если filename является каталогом.

S_ISCHR(stbuf.st_mode)

Возвращает true, если filename является символьным устройством. Устройства вскоре будут обсуждены более подробно.

S_ISBLK(stbuf.st_mode)

Возвращает true, если filename является блочным устройством.

S_ISFIFO(stbuf.st_mode)

Возвращает true, если filename является FIFO.

S_ISLNK(stbuf.st_mode)

Возвращает true, если filename является символической ссылкой. (Это может никогда не вернуть true, если вместо lstat() использовались stat() или fstat().)

S_ISSOCK(stbuf.st_mode)

Возвращает true, если filename является сокетом.

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

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

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

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

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

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

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

Маска Значение Комментарий
S_IFMT 0170000 Маска для битовых полей типа файла
S_IFSOCK 0140000 Сокет.
S_IFLNK 0120000 Символическая ссылка
S_IFREG 0100000 Обычный файл.
S_IFBLK 0060000 Блочное устройство.
S_IFDIR 0040000 Каталог.
S_IFCHR 0020000 Символьное устройство.
S_IFIFO 0010000 FIFO.
S_ISUID 0004000 Бит setuid.
S_ISGID 0002000 Бит setgid
S_ISVTX 0001000 «Липкий» (sticky) бит.
S_IRWXU 0000700 Маска для прав доступа владельца.
S_IRUSR 0000400 Доступ на чтение для владельца.
S_IWUSR 0000200 Доступ на запись для владельца.
S_IXUSR 0000100 Доступ на исполнение для владельца.
S_IRWXG 0000070 Маска для прав доступа группы.
S_IRGRP 0000040 Доступ на чтение для группы.
S_IWGRP 0000020 Доступ на запись для группы.
S_IXGRP 0000010 Доступ на исполнение для группы.
S_IRWXO 0000007 Маска для прав доступа остальных.
S_IROTH 0000004 Доступ на чтение для остальных.
S_IWOTH 0000002 Доступ на запись для остальных.
S_IXOTH 0000001 Доступ на исполнение для остальных.

Некоторые из этих масок служат цели изолирования различных наборов битов, закодированных в поле 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().

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

7.2.7 Поля Типа

Из книги C++ автора Хилл Мюррей

7.2.7 Поля Типа Чтобы использовать производные классы не просто как удобную сокращенную запись в описаниях, надо разрешить следющую проблему: Если задан указатель типа base*, какому проиводному типу в действительности принадлежит указываемый обект? Есть три основных


8.8 Typedef – Определение Типа

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

8.8 Typedef – Определение Типа Описания, содержащие спецификатор_описания typedef, определяют идентификаторы, которы позднее могут использоваться так, как если бы они были ключевыми словами, именующими оновные или производные типы.typedef-имя: идентификаторВнутри области


4.2 СТРУКТУРА ФАЙЛА ОБЫЧНОГО ТИПА

Из книги Linux для пользователя автора Костромин Виктор Алексеевич

4.2 СТРУКТУРА ФАЙЛА ОБЫЧНОГО ТИПА Как уже говорилось, индекс включает в себя таблицу адресов расположения информации файла на диске. Так как каждый блок на диске адресуется по своему номеру, в этой таблице хранится совокупность номеров дисковых блоков. Если бы данные


9.4.1. Определение типа мыши

Из книги Справочное руководство по C++ автора Страустрап Бьярн

9.4.1. Определение типа мыши Вы должны знать две важных характеристики своей мыши: какой у нее интерфейс и какой она использует протокол.Интерфейс - это совокупность аппаратных параметров мыши, включающая такие параметры, как используемые мышью прерывания, порты


12.5.1 Редакторы типа vi

Из книги Системное программирование в среде Windows автора Харт Джонсон М

12.5.1 Редакторы типа vi Редактор vi (или его несколько доработанные потомки) по умолчанию включается в любую UNIX-подобную систему, в том числе и во все дистрибутивы Linux. Все приверженцы UNIX, имеющие значительный стаж работы с этими ОС, знают и используют этот редактор. Описание


R.7.1.6 Спецификация типа

Из книги Справочник по PHP автора

R.7.1.6 Спецификация типа К спецификации типа относятся:спецификация-типа: имя-простого-типа спецификация-класса спецификация-перечисления спецификация-сложного-типа :: имя-класса const volatileПри описании объекта служебные слова const и volatile можно добавить к любой законной


R.14 ШАБЛОНЫ ТИПА

Из книги VBA для чайников автора Каммингс Стив

R.14 ШАБЛОНЫ ТИПА R.14.1 Шаблоны типа Шаблон типа определяет целое семейство типов или функций.описание-шаблона-типа: template ‹ список-параметров-шаблона-типа › описаниесписок-параметров-шаблона-типа: параметр-шаблона-типа список-параметров-шаблона-типа ,


Определение размера файла

Из книги C++. Сборник рецептов автора Диггинс Кристофер

Определение размера файла Размер файла можно получить, используя значение указателя файла, возвращаемое функцией SetFilePointer, если при вызове этой функции задать количество байтов, на которое должен быть перемещен указатель файла, равным 0. Для этой же цели можно


Установка размера файла, инициализация файла и разреженные файлы

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Установка размера файла, инициализация файла и разреженные файлы Функция SetEndOfFile позволяет переустановить размер файла, используя текущее значение указателя файла для определения его размера. Возможно как расширение, так и усечение файла. В случае расширения файла


Определение параметров файла

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Определение параметров файла statФункция собирает вместе всю информацию, выдаваемую операционной системой для указанного файла, и возвращает ее в виде массива.Синтаксис:array stat(string $filename)Этот массив всегда содержит следующие элементы с указанными ключами:Этот массив


Отличия процедур типа Function от процедур типа Sub

Из книги Ноутбук для начинающих. Мобильно, доступно, удобно автора Ковалевский Анатолий Юрьевич

Отличия процедур типа Function от процедур типа Sub Между процедурами типа Function и типа Sub есть одно существенное отличие: в процедуре типа Function обязательно где-то должен присутствовать по крайней мере один оператор, задающий значение этой функции. При этом используется имя


8.6. Определение типа объекта во время выполнения

Из книги автора

8.6. Определение типа объекта во время выполнения ПроблемаВо время выполнения требуется динамически узнавать тип определенного класса.РешениеДля запроса, на объект какого типа указывает адрес объекта, используйте идентификацию типов во время выполнения (обычно


Объявление типа

Из книги автора

Объявление типа Существует два особых вида объявления, в которых объявляется не переменная или функция, а тип данных. Первый вид позволяет определить тег и элементы структуры, объединения или перечислимого типа. После такого объявления имя типа (тег) может быть


Определение типа мьютекса

Из книги автора

Определение типа мьютекса int pthread_mutexattr_settype( pthread_mutexattr_t* attr, int type);int pthread_mutexattr_gettype( const pthread_mutexattr_t* attr, int* type);В версиях QNX 6.2.1 и 6.3 предусматривается создание мьютексов следующих типов:• PTHREAD_MUTEX_NORMAL — для этого типа не проводится контроль «мертвой блокировки» (deadlock) в


Три типа «одежки»

Из книги автора

Три типа «одежки» Все многообразие видов кейсов для ноутбуков можно свести к трем позициям:Сумка. Классическими портфелями-сумками заполнено более 90 % рынка. Может иметь вид женской сумочки, портфеля, кофра, саквояжа, дипломата, чемодана. Имейте в виду, что элементы