Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Интернет » QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович
<< На главную

QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович

Читать онлайн QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 97 98 99 100 101 102 103 104 105 106
Перейти на страницу:

  return EXIT_FAILURE;

 }

 /* В результате по адресу dpp создана структура диспетчеризации */

 /* Инициализация атрибутов менеджера ресурсов */

 memset(&amp;resmgr_attr, 0, sizeof resmgr_attr);

 resmgr_attr.nparts_max = 1;

 resmgr_attr.msg_max_size = MESSIZE_MAX;

 /* Задаем число доступных структур векторов ввода/вывода (IOV) = 1.

    Задаем максимальный размер буфера получения равным MESSIZE_MAX.

    В результате инициализируются атрибуты менеджера ресурсов */

 /* Инициализация функций обработки сообщений */

 iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &amp;connect_funcs,

  _RESMGR_IO_NFUNCS, &amp;io_funcs);

 /* В результате заполняются две таблицы (структуры), задающие функции

    обработки для двух специальных типов сообщений:

    таблица функций связи и таблица функций ввода/вывода.

    В соответствующих местах размещаются принимаемые по умолчанию функции

    iofunc_*_default() ... Своими не заменяем - нет необходимости. */

 /* Инициализация используемой устройством структуры атрибутов */

 iofunc_attr_init(&amp;attr, S_IFNAM | 0666, 0, 0);

 attr.nbytes = MESSIZE_MAX + 1;

 /* В результате инициализируется структура атрибутов,

    используемая устройством;

    S_IFNAM указывает, что тип устройства - Special named file,

    побитовые флаги определяют права доступа,

    число байт в ресурсе задается равным размеру буфера. */

 /* Прикрепление имени устройства */

 if ((id = resmgr_attach(dpp, &amp;resmgr_attr, &quot;/dev/MESSTEST/RM&quot;, _FTYPE_ANY,

  0, &amp;connect_funcs, &amp;io_funcs, &amp;attr)) == -1) {

  printf(&quot;%s: невозможно прикрепить имя менеджера&quot;

   &quot; ресурсов.n&quot;, argv[0]);

  return EXIT_FAILURE;

 }

 /* Ключевое действие: мы регистрируем на нашем узле имя /dev/MESSTEST/RM

    dpp и resmgr_attr - инициализированные выше структуры;

    /dev/MESSTEST/RM - ассоциированное с устройством имя,

    _FTYPE_ANY - определяет тип открытия устройства (в данном случае

    допускается любой тип запроса открытия); равный нулю флаг

    разборки пути имени файла определяет, что запрос -

    только по имени /dev/MESSTEST/RM,

    &amp;connect_funcs - заданные выше подпрограммы связи;

    &amp;io_funcs - заданные выше подпрограммы ввода/вывода;

    attr - инициализированная выше структура атрибутов устройства.

    Подключаем диапазон сообщений, которые должны рассматриваться как

    приватные, с передачей их обработчику для таких сообщений -

    PrivatHandler() */

 if (message_attach(dpp, NULL, 0x5000, 0x5fff, &amp;PrivatHandler, NULL) == -1) {

  printf(&quot;невозможно подключить данный &quot;

   &quot;диапазон приватных сообщенийn&quot;);

  return(EXIT_FAILURE);

 }

 /* Размещение контекстной структуры */

 ctp = dispatch_context_alloc(dpp);

 /* Размер буфера сообщений, содержащегося а этой структуре, равно как и

    число векторов ввода/вывода, также содержащихся в этой структуре,

    установлены при инициализации структуры атрибутов менеджера ресурсов */

 /* Запуск петли сообщений менеджера ресурсов */

 while(1) {

  // ожидание прихода сообщений

  if ((ctp = dispatch_block(ctp)) == NULL) {

   printf(&quot;ошибка блокаn&quot;);

   return EXIT_FAILURE;

  }

  printf(&quot;Менеджер ресурсов получил сообщение&quot;

   &quot; длиной %i байтn&quot;, ctp-&gt;resmgr_context.info.msglen);

  result = dispatch_handler(ctp);

  // сообщение раскодируется, и на основании заданных таблиц функций связи

  // и ввода/вывода вызывается соответствующая функция обработки сообщения

  if (result)

   printf(&quot;Менеджер ресурсов не смог обработать&quot;

    &quot; сообщение result = %in&quot;, result);

 }

}

/********************************************************************

Обработчик приватных сообщений, то есть сообщений, заголовок которых

укладывается в диапазон, указанный при вызове функции message_attach()

********************************************************************/

int PrivatHandler(message_context_t* ctp, int code,

1 ... 97 98 99 100 101 102 103 104 105 106
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга