Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
Вообще говоря, возврат элементов каталога — это почти то же самое, что и возврат «сырых» данных, за исключением того, что:
• вы должны возвратить целое число структур типа
• эти структуры
Первый пункт означает, что вы не можете возвратить, например, семь с половиной структур
Второй пункт достаточно очевиден. Он упомянут здесь только потому, что заполнение структуры
Давайте взглянем на структуру
Чтобы работать с каталогами, клиент использует функции closedir, opendir, readdir, rewinddir, seekdir и telldir.
Обратите внимание на сходство с «нормальными» функций для файлов (и совпадение применяемых типов сообщений):
Функция для работы с каталогами | Функция для работы с файлами | Сообщение |
---|---|---|
closedir | close | IO_CLOSE_DUP |
opendir | open | _IO_CONNECT |
readdir | read | _IO_READ |
rewinddir | lseek | _IO_LSEEK |
seekdir | lseek | _IO_LSEEK |
telldir | tell | _IO_LSEEK |
Если мы на мгновение вообразим, что функции opendir и closedir будут обработаны для нас автоматически, мы сможем сконцентрироваться только на сообщениях типа _IO_READ и _IO_LSEEK и на соответствующих им функциях.
Сообщение _IO_LSEEK и соответствующая ему функция применяются для «поиска» (или «перемещения») в пределах файла. С каталогом происходит та же история. Вы можете переместиться к «первому» элементу каталога (как явно задав смещение функции seekdir, так и вызвав функцию rewinddir) переместиться к любому произвольному элементу (используя функцию seekdir), или же узнать свою текущую позицию в списке элементов каталога (вызвав функцию telldir).
Однако, «хитрость» при работе с каталогами состоит в том, что смещения задаете вы сами, и управление ими тоже всецело лежит на вас. Это означает, что вы можете назначать смещения элементов в каталоге равными как «0», «2» и так далее, так и «0», «64», «128» и так далее. Единственно, что здесь необходимо предусмотреть — чтобы обработчики io_lseek и io_read одинаково трактовали эти смещения.
В приведенном ниже примере мы предположим, что используется простой подход с номерами «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. |
При возврате структур типа
Давайте для примера создадим администратора каталогового ресурса
Приведенный пример показывает, что в каталоге