Арнольд Роббинс - Linux программирование в примерах Страница 38
- Категория: Компьютеры и Интернет / Программное обеспечение
- Автор: Арнольд Роббинс
- Год выпуска: -
- ISBN: -
- Издательство: -
- Страниц: 165
- Добавлено: 2019-06-19 14:34:53
Арнольд Роббинс - Linux программирование в примерах краткое содержание
Прочтите описание перед тем, как прочитать онлайн книгу «Арнольд Роббинс - Linux программирование в примерах» бесплатно полную версию:В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Арнольд Роббинс - Linux программирование в примерах читать онлайн бесплатно
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().
5.4.4.1. Сведения об устройстве
Стандарт POSIX не определяет значение типа dev_t, поскольку предполагалось его использование на не-Unix системах также, как на Unix-системах. Однако стоит знать, что находится в dev_t.
Когда истинно S_ISBLK(sbuf.st_mode) или S_ISCHR(sbuf.st_mode), сведения об устройстве находятся в поле sbuf.st_rdev. В противном случае это поле не содержит никакой полезной информации.
Традиционно файлы устройств Unix кодируют старший и младший номера устройства в значении dev_t. По старшему номеру различают тип устройства, такой, как «дисковый привод» или «ленточный привод». Старшие номера различают также разные типы устройств, такие, как диск SCSI в противоположность диску IDE. Младшие номера различают устройства данного типа, например, первый диск или второй. Вы можете увидеть эти значения с помощью 'ls -l':
$ ls -l /dev/hda /dev/hda? /* Показать номера для первого жесткого диска */
brw-rw---- 1 root disk 3, 0 Aug 31 2002 /dev/hda
brw-rw---- 1 root disk 3, 1 Aug 31 2002 /dev/hda1
brw-rw---- 1 root disk 3, 2 Aug 31 2002 /dev/hda2
brw-rw---- 1 root disk 3, 3 Aug 31 2002 /dev/hda3
brw-rw---- 1 root disk 3, 4 Aug 31 2002 /dev/hda4
brw-rw---- 1 root disk 3, 5 Aug 31 2002 /dev/hda5
brw-rw---- 1 root disk 3, 6 Aug 31 2002 /dev/hda6
brw-rw---- 1 root disk 3, 7 Aug 31 2002 /dev/hda7
brw-rw---- 1 root disk 3, 8 Aug 31 2002 /dev/hda8
brw-rw---- 1 root disk 3, 9 Aug 31 2002 /dev/hda9
$ ls -l /dev/null /* Показать сведения также для /dev/null */
crw-rw-rw- 1 root root 1, 3 Aug 31 2002 /dev/null
Вместо размера файла ls отображает старший и младший номера. В случае жесткого диска /dev/hda представляет диск в целом, /dev/hda1, /dev/hda2 и т.д. представляют разделы внутри диска. У них у всех общий старший номер устройства (3), но различные младшие номера устройств.
Обратите внимание, что дисковые устройства являются блочными устройствами, тогда как /dev/null является символьным устройством. Блочные и символьные устройства являются отдельными сущностями; даже если символьное устройство и блочное устройство имеют один и тот же старший номер устройства, они необязательно связаны
Старший и младший номера устройства можно извлечь из значения dev_t с помощью функций major() и 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. В других отношениях ее использование выходит за рамки данной книги; патологически любопытные должны посмотреть mknod(2).
Следующая программа, ch05-devnum.c, показывает, как использовать системный вызов stat(), макросы проверки типа файла и, наконец, макросы 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 path\n", argv[0]);
exit(1);
}
if (stat(argv[1], &sbuf) < 0) {
Жалоба
Напишите нам, и мы в срочном порядке примем меры.