Вход/Регистрация
Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
вернуться

Кёртен Роб

Шрифт:

Однако, «хитрость» при работе с каталогами состоит в том, что смещения задаете вы сами, и управление ими тоже всецело лежит на вас. Это означает, что вы можете назначать смещения элементов в каталоге равными как «0», «2» и так далее, так и «0», «64», «128» и так далее. Единственно, что здесь необходимо предусмотреть — чтобы обработчики io_lseek и io_read одинаково трактовали эти смещения.

В приведенном ниже примере мы предположим, что используется простой подход с номерами «0», «1», «2», и т.д. (Вы могли бы использовать «0», «64», «128», и т.д., если бы эти числа соответствовали, например, неким смещениям на носителе. Выбор за вами!)

Содержимое

Ну вот, остается «просто» заполнить

struct dirent
«содержимым» нашего каталога. Структура
struct dirent
выглядит так (взято из
<dirent.h>
):

struct dirent {

 ino_t d_ino;

 off_t d_offset;

 uint16_t d_reclen;

 uint16_t d_namelen;

 char d_name[1];

};

Коротко о ее полях:

d_ino «Индексный дескриптор» («inode») — уникальный для точки монтирования порядковый номер, который не может быть нулевым (нуль указывал бы на то, что элемент, соответствующий данному индексному дескриптору, является свободным/пустым).
d_offset Смещение в каталоге, о котором мы только что говорили. В нашем примере это будут обычные числа типа «0», «1», «2», и т.д.
d_reclen Размер структуры
struct dirent
целиком, включая любые добавляемые в нее расширения. Заполнители для выравнивания при вычислении размера учитываются.
d_namelen Число символов в поле d_name, не включая признак конца строки NULL.
d_name Имя элемента каталога, которое должно завершаться признаком конца строки — 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
.)

Теперь, когда мы знаем нужные характеристики, давайте посмотрим на код. Он разбит на следующие функции:

main и декларации

Основная функция; здесь мы все инициализируем и запускаем наш администратор ресурса.

my_open

Обработчик сообщения _IO_CONNECT.

my_read

Обработчик сообщения _IO_READ.

my_read_dir и my_read_file

Выполняют фактическую работу функции my_read.

dirent_size и dirent_fill

Сервисные функции для работы со структурой

struct diren
t.

Заметьте, что при том, что разбит на короткие секции, перемежаемые текстовыми пояснениями, архив с полным исходным текстом в виде единого файла можно взять на веб-сайте компании PARSE Software Devices (

http://www.parse.com/
), он называется
atoz.c.

main и декларации
  • Читать дальше
  • 1
  • ...
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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