Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
Теперь, когда мы знаем нужные характеристики, давайте посмотрим на код. Он разбит на следующие функции:
main и декларации
Основная функция; здесь мы все инициализируем и запускаем наш администратор ресурса.
my_open
Обработчик сообщения _IO_CONNECT.
my_read
Обработчик сообщения _IO_READ.
my_read_dir и my_read_file
Выполняют фактическую работу функции my_read.
dirent_size
Сервисные функции для работы со структурой
Заметьте, что при том, что разбит на короткие секции, перемежаемые текстовыми пояснениями, архив с полным исходным текстом в виде единого файла можно взять на веб-сайте компании 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» зарезервирована).
Каталоговая атрибутная запись:
Маркируется как файл типа «каталог» (константа S_IFDIR) с режимом доступа 0555 (это означает, что доступ по чтению и поиску имеет каждый, но доступа по записи нет ни у кого). Размер определен как «26» — это просто число, взятое по количеству элементов в каталоге. Индексный дескриптор выбран равным «27» — это число заведомо не используется больше ни в одной атрибутной записи.
Обратите внимание, что мы переопределили только поле open структуры connect_func и поле read структуры io_func. Для всех остальных полей сохранены POSIX-значения по умолчанию.
Наконец, обратите внимание, как мы создали имя