Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

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) {

fprintf(stderr, "%s: stat: %s\n", argv[1], strerror(errno));

exit(1);

 }

 if (S_ISCHR(sbuf.st_mode))

devtype = "char";

 else if (S_ISBLK(sbuf.st_mode))

devtype = "block";

 else {

fprintf(stderr, "%s is not a block or character device\n",

argv[1]);

exit(1);

 }

 printf("%s: major: %d, minor: %d\n", devtype,

major(sbuf.st_rdev), minor(sbuf.st_rdev));

 exit(0);

}

Вот

что происходит при запуске программы:

$ ch05-devnum /tmp /* Попробовать не устройство */

/tmp is not a block or character device

$ ch05-devnum /dev/null /* Символьное устройство */

char: major: 1, minor: 3

$ ch05-devnum /dev/hda2 /* Блочное устройство */

block: major: 3, minor: 2

К счастью, вывод согласуется с выводом

ls
, давая нам уверенность [59] , что мы в самом деле написали правильный код.

Воспроизведение вывода ls замечательно и хорошо, но действительно ли это полезно? Ответ — да. Любое приложение, работающее с иерархиями файлов, должно быть способно различать различные типы файлов. Подумайте об архиваторе, таком как

tar
или
cpio
. Было бы пагубно, если бы такая программа рассматривала файл дискового устройства как обычный файл, пытаясь прочесть его и сохранить его содержимое в архиве! Или подумайте о
find
, которая может выполнять произвольные действия, основываясь на типе и других атрибутах файлов, с которыми она сталкивается, (
find
является сложной программой; посмотрите find(1), если вы с ней не знакомы.) Или даже нечто простое, как пакет, оценивающий свободное дисковое пространство, тоже должно отличать обычные файлы от всего остального.

59

Технический термин warm fuzzyПримеч. автора.

5.4.4.2. Возвращаясь к V7

cat

В разделе 4.4.4 «Пример: Unix cat» мы обещали вернуться к программе V7

cat
, чтобы посмотреть, как она использует системный вызов
stat
. Первая группа строк, использовавшая ее, была такой:

31 fstat(fileno(stdout), &statb);

32 statb.st_mode &= S_IFMT;

33 if (statb.st_mode != S_IFCHR && statb.st_mode != S_IFBLK) {

34 dev = statb.st_dev;

35 ino = statb.st_ino;

36 }

Этот код теперь должен иметь смысл. В строке 31 вызывается

fstat
для стандартного вывода, чтобы заполнить структуру
statb
. Строка 32 отбрасывает всю информацию в
statb.st_mode
за исключением типа файла, используя логическое AND с маской
S_IFMT
. Строка 33 проверяет, что используемый для стандартного вывода файл не является файлом устройства. В таком случае программа сохраняет номера устройства и индекса в
dev
и
ino
. Эти значения затем проверяются для каждого входного файла в строках 50–56.

Поделиться:
Популярные книги

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VII

Двойник короля 16

Скабер Артемий
16. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 16

Горячий старт. Часть 2

Глазачев Георгий
2. Бесконечная Империя Вечности
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Горячий старт. Часть 2

Я – Легенда

Гарцевич Евгений Александрович
1. Я - Легенда!
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
5.00
рейтинг книги
Я – Легенда

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Наследник 2

Шимохин Дмитрий
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Наследник 2

Камень. Книга шестая

Минин Станислав
6. Камень
Фантастика:
боевая фантастика
7.64
рейтинг книги
Камень. Книга шестая

Последний реанорец. Том I и Том II

Павлов Вел
1. Высшая Речь
Фантастика:
фэнтези
7.62
рейтинг книги
Последний реанорец. Том I и Том II

Газлайтер. Том 20

Володин Григорий Григорьевич
20. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 20

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV

Мечников. Луч надежды

Алмазов Игорь
8. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Мечников. Луч надежды

Сфирот

Прокофьев Роман Юрьевич
8. Стеллар
Фантастика:
боевая фантастика
рпг
6.92
рейтинг книги
Сфирот

Древесный маг Орловского княжества 3

Павлов Игорь Васильевич
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Древесный маг Орловского княжества 3

Я еще царь. Книга XXX

Дрейк Сириус
30. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще царь. Книга XXX