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

Библиотека администратора ресурсов

Прежде чем лезть в глубины организации администраторов ресурсов, познакомимся сначала с библиотекой администратора ресурсов, разработанной QSSL. Отметим, что в действительности эта «библиотека» состоит из нескольких четко различимых частей:

• функции пула потоков (мы обсуждали их в главе «Процессы и потоки», в параграфе «Пулы потоков»);

• интерфейс диспетчеризации;

• функции администратора ресурсов;

• вспомогательные функции POSIX-библиотеки.

При том, что можно было бы, конечно, писать администраторы ресурсов «с нуля» (как это делалось в QNX4), эта овчинка часто не стоит такой выделки.

Просто для демонстрации практичности библиотечного подхода — вот код однопоточной версии администратора «/dev/null»:

/*
 * resmgr1.c
 *

 * /dev/null на основе библиотеки администратора ресурсов
*/
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
int main(int argc, char **argv) {
 dispatch_t             *dpp;
 resmgr_attr_t          resmgr_attr;
 resmgr_context_t       *ctp;
 resmgr_connect_funcs_t connect_func;
 resmgr_io_funcs_t      io_func;
 iofunc_attr_t          attr;
 // Создать структуру диспетчеризации
 if ((dpp = dispatch_create()) == NULL) {
  perror("Ошибка dispatch_createn");
  exit(EXIT_FAILURE);
 }
 // Инициализировать структуры данных
 memset(&resmgr_attr, 0, sizeof(resmgr_attr));
 resmgr_attr.nparts_max = 1;
 resmgr_attr.msg_max_size = 2048;
 // Назначить вызовам обработчики по умолчанию
 iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_func,
  _RESMGR_IO_NFUNCS, &io_func);
 iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);
 // Зарегистрировать префикс в пространстве имен путей
 if (resmgr_attach(dpp, &resmgr_attr,
  "/dev/mynull", _FTYPE_ANY,
  0, &connect_func, &io_func, &attr) == -1) {
  perror("Ошибка resmgr_attachn");
  exit(EXIT_FAILURE);
 }
 ctp = resmgr_context_alloc(dpp);
 // Ждать сообщений в вечном цикле
 while (1) (
  if ((ctp = resmgr_block(ctp)) == NULL) {
   perror("Ошибка resmgr_blockn");
   exit(EXIT_FAILURE);
  }
  resmgr_handler(ctp);
 }
}

И все! Полнофункциональный администратор ресурса /dev/null реализуется всего несколькими вызовами функций!

Если бы пришлось писать аналогичный по функциональности администратор (то есть с поддержкой функций stat(), chown(), chmod(), и т.д.) «с нуля», то вам пришлось бы перелопатить сотни, если не тысячи строк Си-кода.

Оглавление книги


Генерация: 1.490. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз