Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
Поле «to» | Поле «from» | Значение |
---|---|---|
0 | 0 | Передачи данных нет |
0 | 1 | Передача от драйвера клиенту |
1 | 0 | Передача от клиента драйверу |
1 | 1 | Двунаправленная передача |
В случае, когда передачи данных нет,
Отметим, что структуры данных, предназначенные для ввода и вывода, дополнены нулями, чтобы быть выровненными друг относительно друга. Это означает, что неявная область данных начинается в этих структурах с того же самого адреса.
Если вы используете вспомогательную функцию iofunc_devctl, то имейте в виду, что если она не сможет сделать что-либо с сообщением devctl, она возвратит вам константу _RESMGR_DEFAULT. Эта сделано для отделения корректных значений errno от возвращаемого признака «нераспознанная команда». Получив _RESMGR_DEFAULT, базовый уровень библиотеки ответит установкой errno в значение ENOSYS, которое будет транслировано клиентской библиотечной функцией devctl в значение ENOTTY, «корректное» с точки зрения POSIX.
Проверка режима открытия и сопоставление его с выполняемой операцией лежит всецело на совести вашей функции — ни в клиентской devctl, ни в библиотеке администратора ресурсов никаких проверок не выполняется. Например, можно открыть администратор ресурса в режиме «только для чтения», а затем выдать ему посредством devctl команду «отформатировать жесткий диск» (которая, в общем, является весьма нехилой операцией записи). Так вот, с точки зрения администратора было бы весьма предусмотрительно до выполнения такой операции сначала проверить режим открытия ресурса.
Отметим, что диапазон доступных пользователю значений dcmd ограничен (значения от 0x0000 до 0x0FFF включительно зарезервированы QSSL). Другие значения можно смело использовать — см. заголовочные файлы с именами
Возвращает: Код завершения, при помощи вспомогательного макроса _RESMGR_STATUS, и буфер приема (с ответными данными, если надо).
Для примера см. ниже параграф «Простой пример функции io_devctl».
Классификация: Функция ввода/вывода
Обработчик по умолчанию: NULL (обрабатывается
Вспомогательные функции: Нет
Клиентская функция: dup, dup2, fcntl, fork, spawn*, fork
Сообщения: _IO_DUP
Структура данных:
Описание: Это обработчик сообщений dup. Как и в случае с io_close_dup, вы вряд ли будете обрабатывать это сообщение самостоятельно. За вас это сделает базовый уровень библиотеки.
Возвращает: Код завершения, при помощи вспомогательного макроса _RESMGR_STATUS.
Данная функция зарезервирована QSSL для будущего использования. Вам следует инициализировать таблицу функций ввода/вывода при помощи iofunc_func_init и не изменять данную точку входа.
Классификация: Функция установления соединения
Обработчик по умолчанию: Нет
Вспомогательные функции: iofunc_link
Клиентская функция: link
Сообщения: _IO_CONNECT, подтип IO_CONNECT_LINK
Структура данных: