Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
Если мы на мгновение вообразим, что функции opendir и closedir будут обработаны для нас автоматически, мы сможем сконцентрироваться только на сообщениях типа _IO_READ и _IO_LSEEK и на соответствующих им функциях.
Сообщение _IO_LSEEK и соответствующая ему функция применяются для «поиска» (или «перемещения») в пределах файла. С каталогом происходит та же история. Вы можете переместиться к «первому» элементу каталога (как явно задав смещение функции seekdir, так и вызвав функцию rewinddir) переместиться к любому произвольному элементу (используя функцию seekdir), или же узнать свою текущую позицию в списке элементов каталога (вызвав функцию telldir).
Однако,
В приведенном ниже примере мы предположим, что используется простой подход с номерами «0», «1», «2», и т.д. (Вы могли бы использовать «0», «64», «128», и т.д., если бы эти числа соответствовали, например, неким смещениям на носителе. Выбор за вами!)
Ну вот, остается «просто» заполнить
Коротко о ее полях:
d_ino | «Индексный дескриптор» («inode») — уникальный для точки монтирования порядковый номер, который не может быть нулевым (нуль указывал бы на то, что элемент, соответствующий данному индексному дескриптору, является свободным/пустым). |
d_offset | Смещение в каталоге, о котором мы только что говорили. В нашем примере это будут обычные числа типа «0», «1», «2», и т.д. |
d_reclen | Размер структуры struct dirent целиком, включая любые добавляемые в нее расширения. Заполнители для выравнивания при вычислении размера учитываются. |
d_namelen | Число символов в поле d_name, не включая признак конца строки NULL. |
d_name | Имя элемента каталога, которое должно завершаться признаком конца строки — NULL. |
При возврате структур типа
Давайте для примера создадим администратора каталогового ресурса
Приведенный
пример показывает, что в каталогеТеперь, когда мы знаем нужные характеристики, давайте посмотрим на код. Он разбит на следующие функции:
main и декларации
Основная функция; здесь мы все инициализируем и запускаем наш администратор ресурса.
my_open
Обработчик сообщения _IO_CONNECT.
my_read
Обработчик сообщения _IO_READ.
my_read_dir и my_read_file
Выполняют фактическую работу функции my_read.
dirent_size и dirent_fill
Сервисные функции для работы со структурой
Заметьте, что при том, что разбит на короткие секции, перемежаемые текстовыми пояснениями, архив с полным исходным текстом в виде единого файла можно взять на веб-сайте компании PARSE Software Devices (
Первый приведенный раздел программы представляет собой функцию main и ряд деклараций. Для удобства объявлен макрос ALIGN, который используется функциями dirent_size и dirent_fill для выравнивания.
Массив atoz_attrs содержит атрибутные записи, используемые в этом примере для «файлов». Мы объявляем массив из NUM_ENTS элементов, потому что у нас есть NUM_ENTS (то есть 26) файлов — от «
Файловая атрибутная запись:
Маркируется как обычный файл (константа S_IFREG) с режимом доступа 0444 (это означает, что доступ по чтению имеет каждый, но доступа по записи нет ни у кого). Размер равен «1» — файл содержит только один байт, а именно прописную букву, соответствующую своему имени. Индексные дескрипторы (inodes) этих файлов пронумерованы от «1» до «26» включительно (было бы удобнее взять числа от «0» до «25», но цифра «0» зарезервирована).
Каталоговая атрибутная запись: