Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Некоторые из этих масок служат цели изолирования различных наборов битов, закодированных в поле
st_mode•
S_IFMT•
S_IRWXU•
S_IRWXG•
S_IRWXOБиты прав доступа и типа файла графически изображены на рис. 5.3.

Рис. 5.3. Биты прав доступа и типа файлов
Маски типов файлов стандартизованы главным образом для совместимости со старым кодом; они не должны использоваться непосредственно, поскольку такой код менее читаем, чем соответствующие макросы. Случается, что макрос реализован с использованием масок: довольно логично, но это не подходит для кода уровня пользователя.
Стандарт POSIX явным образом констатирует; что в будущем не будут стандартизированы новые битовые маски и что тесты для любых дополнительных разновидностей типов файлов, которые могут быть добавлены, будут доступны лишь в виде макросов
S_IS<i>xxx</i>()5.4.4.1. Сведения об устройстве
Стандарт POSIX не определяет значение типа
dev_tdev_tКогда истинно
S_ISBLK(sbuf.st_mode)S_ISCHR(sbuf.st_mode)sbuf.st_rdevТрадиционно файлы устройств Unix кодируют старший и младший номера устройства в значении
dev_tls -l$ <b>ls -l /dev/hda /dev/hda?</b> /* Показать номера для первого жесткого диска */brw-rw---- 1 root disk 3, 0 Aug 31 2002 /dev/hdabrw-rw---- 1 root disk 3, 1 Aug 31 2002 /dev/hda1brw-rw---- 1 root disk 3, 2 Aug 31 2002 /dev/hda2brw-rw---- 1 root disk 3, 3 Aug 31 2002 /dev/hda3brw-rw---- 1 root disk 3, 4 Aug 31 2002 /dev/hda4brw-rw---- 1 root disk 3, 5 Aug 31 2002 /dev/hda5brw-rw---- 1 root disk 3, 6 Aug 31 2002 /dev/hda6brw-rw---- 1 root disk 3, 7 Aug 31 2002 /dev/hda7brw-rw---- 1 root disk 3, 8 Aug 31 2002 /dev/hda8brw-rw---- 1 root disk 3, 9 Aug 31 2002 /dev/hda9$ <b>ls -l /dev/null</b> /* Показать сведения также для /dev/null */crw-rw-rw- 1 root root 1, 3 Aug 31 2002 /dev/nullВместо размера файла
ls/dev/hda/dev/hda1/dev/hda2Обратите внимание, что дисковые устройства являются блочными устройствами, тогда как
/dev/nullСтарший и младший номера устройства можно извлечь из значения
dev_tmajor()minor()<sys/sysmacros.h>#include <sys/types.h> /* Обычный */#include <sys/sysmacros.h>int major(dev_t dev); /* Старший номер устройства */int minor(dev_t dev); /* Младший номер устройства */dev_t makedev(int major, int minor); /* Создать значение dev_t */(Некоторые системы реализуют их в виде макросов.)
Функция
makedev()dev_tСледующая программа,
ch05-devnum.cstat()major()minor()/* ch05-devnum.c --- Демонстрация stat(), major(), minor(). */#include <stdio.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/sysmacros.h>int main(int argc, char **argv) { struct stat sbuf; char *devtype; if (argc != 2) { fprintf(stderr, "usage: %s pathn", argv[0]); exit(1); } if (stat(argv[1], &sbuf) < 0) { fprintf(stderr, "%s: stat: %sn", argv[1], strerror(errno)); exit(1); } if (S_ISCHR(sbuf.st_mode))