QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович
return EXIT_FAILURE;
}
/* В результате по адресу dpp создана структура диспетчеризации */
/* Инициализация атрибутов менеджера ресурсов */
memset(&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, &connect_funcs,
_RESMGR_IO_NFUNCS, &io_funcs);
/* В результате заполняются две таблицы (структуры), задающие функции
обработки для двух специальных типов сообщений:
таблица функций связи и таблица функций ввода/вывода.
В соответствующих местах размещаются принимаемые по умолчанию функции
iofunc_*_default() ... Своими не заменяем - нет необходимости. */
/* Инициализация используемой устройством структуры атрибутов */
iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);
attr.nbytes = MESSIZE_MAX + 1;
/* В результате инициализируется структура атрибутов,
используемая устройством;
S_IFNAM указывает, что тип устройства - Special named file,
побитовые флаги определяют права доступа,
число байт в ресурсе задается равным размеру буфера. */
/* Прикрепление имени устройства */
if ((id = resmgr_attach(dpp, &resmgr_attr, "/dev/MESSTEST/RM", _FTYPE_ANY,
0, &connect_funcs, &io_funcs, &attr)) == -1) {
printf("%s: невозможно прикрепить имя менеджера"
" ресурсов.n", argv[0]);
return EXIT_FAILURE;
}
/* Ключевое действие: мы регистрируем на нашем узле имя /dev/MESSTEST/RM
dpp и resmgr_attr - инициализированные выше структуры;
/dev/MESSTEST/RM - ассоциированное с устройством имя,
_FTYPE_ANY - определяет тип открытия устройства (в данном случае
допускается любой тип запроса открытия); равный нулю флаг
разборки пути имени файла определяет, что запрос -
только по имени /dev/MESSTEST/RM,
&connect_funcs - заданные выше подпрограммы связи;
&io_funcs - заданные выше подпрограммы ввода/вывода;
attr - инициализированная выше структура атрибутов устройства.
Подключаем диапазон сообщений, которые должны рассматриваться как
приватные, с передачей их обработчику для таких сообщений -
PrivatHandler() */
if (message_attach(dpp, NULL, 0x5000, 0x5fff, &PrivatHandler, NULL) == -1) {
printf("невозможно подключить данный "
"диапазон приватных сообщенийn");
return(EXIT_FAILURE);
}
/* Размещение контекстной структуры */
ctp = dispatch_context_alloc(dpp);
/* Размер буфера сообщений, содержащегося а этой структуре, равно как и
число векторов ввода/вывода, также содержащихся в этой структуре,
установлены при инициализации структуры атрибутов менеджера ресурсов */
/* Запуск петли сообщений менеджера ресурсов */
while(1) {
// ожидание прихода сообщений
if ((ctp = dispatch_block(ctp)) == NULL) {
printf("ошибка блокаn");
return EXIT_FAILURE;
}
printf("Менеджер ресурсов получил сообщение"
" длиной %i байтn", ctp->resmgr_context.info.msglen);
result = dispatch_handler(ctp);
// сообщение раскодируется, и на основании заданных таблиц функций связи
// и ввода/вывода вызывается соответствующая функция обработки сообщения
if (result)
printf("Менеджер ресурсов не смог обработать"
" сообщение result = %in", result);
}
}
/********************************************************************
Обработчик приватных сообщений, то есть сообщений, заголовок которых
укладывается в диапазон, указанный при вызове функции message_attach()
********************************************************************/
int PrivatHandler(message_context_t* ctp, int code,