Однако, «хитрость» при работе с каталогами состоит в том, что
В приведенном ниже примере мы предположим, что используется простой подход с номерами «0», «1», «2», и т.д. (Вы могли бы использовать «0», «64», «128», и т.д., если бы эти числа соответствовали, например, неким смещениям на носителе. Выбор за вами!)
Ну вот, остается «просто» заполнить struct dirent
struct dirent
выглядит так (взято из
):struct dirent {
ino_t
off_t
uint16_t
uint16_t
char
};
Коротко о ее полях:
«Индексный дескриптор» («inode») — уникальный для точки монтирования порядковый номер, который не может быть нулевым (нуль указывал бы на то, что элемент, соответствующий данному индексному дескриптору, является свободным/пустым). | |
Смещение в каталоге, о котором мы только что говорили. В нашем примере это будут обычные числа типа «0», «1», «2», и т.д. | |
Размер структуры struct dirent целиком, включая любые добавляемые в нее расширения. Заполнители для выравнивания при вычислении размера учитываются. | |
Число символов в поле | |
Имя элемента каталога, которое должно завершаться признаком конца строки — NULL. |
При возврате структур типа struct dirent
Давайте для примера создадим администратора каталогового ресурса /dev/atoz
/dev/atoz/a
до /dev/atoz/z
, чтобы команда cat, примененная к любому из них, возвращала соответствующие их именам заглавные буквы. Чтобы понять, как это должно работать, вот пример командно-строковой сессии:# cd /dev
# ls
atoz null ptyp2 socket ttyp0 ttyp3
enet0 ptyp0 ptyp3 text ttyp1 zero
mem ptyp1 shmem tty ttyp2
# ls -ld atoz
dr-xr-xr-x 1 root 0 26 Sep 05 07:59 atoz
# cd atoz
# ls
a e i m q u y
b f j n r v z
c g k o s w
d h l p t x
# ls -l e
-r--r--r-x 1 root 0 1 Sep 05 07:59 e
# cat m
M# cat q
Q#
Приведенный пример показывает, что в каталоге /dev
atoz
, и что к нему можно применить команду ls
и выполнить в него cd
. Данный каталог /dev/atoz
имеет размер «26» — мы так задали в нашей программе. Сменив текущий каталог на atoz
и выполнив еще одну ls
, получаем его содержимое — файлы с именами от а
до z
. Выполнив ls
для отдельного файла — в данном случае для файла e
— мы видим, что файл доступен по чтению всем (часть «-r--r--r--
») и имеет размер, равный 1 байту. Наконец, выполнение нескольких cat
показывает, что файлы действительно имеют заявленное содержимое. (Отметим, что поскольку файлы содержат только один байт и не содержат символа новой строки, после вывода символа строка не переводится, и приглашение командного интерпретатора оказывается на той же самой строке, что и вывод cat
.)Теперь, когда мы знаем нужные характеристики, давайте посмотрим на код. Он разбит на следующие функции:
Основная функция; здесь мы все инициализируем и запускаем наш администратор ресурса.
Обработчик сообщения _IO_CONNECT.
Обработчик сообщения _IO_READ.
Выполняют фактическую работу функции
Сервисные функции для работы со структурой struct diren
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT