Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
• функции пула потоков (мы обсуждали их в главе «Процессы и потоки», в параграфе «Пулы потоков»);
• интерфейс диспетчеризации;
• функции администратора ресурсов;
• вспомогательные функции POSIX-библиотеки.
При том, что можно было бы, конечно, писать администраторы ресурсов «с нуля» (как это делалось в QNX4), эта овчинка часто не стоит такой выделки.
Просто для демонстрации практичности библиотечного подхода — вот код однопоточной версии администратора «
И все! Полнофункциональный администратор ресурса
Если бы пришлось писать аналогичный по функциональности администратор (то есть с поддержкой функций stat, chown, chmod, и т.д.) «с нуля», то
вам пришлось бы перелопатить сотни, если не тысячи строк Си-кода.Реально все это за вас делает библиотека
Как вариант начального знакомства с библиотекой, давайте посмотрим, что делают вызовы, использованные в администраторе ресурсов
dispatch _create
Создает структуру диспетчеризации; она будет использоваться для блокирования по приему сообщения.
iofunc_attr_init
Инициализирует используемую устройством атрибутную запись. Мы обсудим атрибутные записи в подробностях несколько позже, а вкратце так: атрибутная запись содержит информацию об устройстве, и на каждое имя устройства имеется по одной атрибутной записи.
iofunc_func_init
Инициализирует две структуры данных, cfuncs и ifuncs, которые содержат соответственно указатели на функции установления соединения и функции ввода/вывода. Это, пожалуй, самый «магический» вызов, поскольку именно он назначает подпрограммы обработки сообщений, привязывая их к структурам данных. Заметьте, что никакого кода обработки сообщений установления соединения или сообщений ввода/вывода, генерируемых функциями read, stat или им подобными, в администраторе нет. Дело в том, что библиотека содержит для всех сообщений готовые POSIX-обработчики по умолчанию, и как раз функция iofunc_func_init– то и привязывает их к двум передаваемым ей таблицам.
resmgr_attach
Создает канал, который администратор ресурса будет использовать для приема сообщений, и говорит администратору процессов, что мы намерены отвечать за «
resmgr_context_alloc
Выделяет внутренний контекстный блок администратора ресурса. Мы рассмотрим этот блок в подробностях несколько позже, а вкратце — он содержит информацию, относящуюся к обрабатываемому сообщению.
resmgr_block
Это блокирующий вызов администратора ресурса — функция, с помощью которой мы ожидаем сообщение от клиента.
resmgr_handler
После того как сообщение от клиента получено, для его обработки вызывается эта функция.
За кулисами библиотеки
Вы уже видели, что наша программа ответственна за предоставление основного рабочего цикла приема сообщений: