Чтение онлайн

ЖАНРЫ

QNX/UNIX: Анатомия параллелизма
Шрифт:

#include <unistd.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>

#include <devctl.h>

#include <locale.h>

#include "/home/ZZZ/TESTS/MR/MessTest.h"

int PrivatHandler(message_context_t *ctp, int code,

unsigned flags, void* handle);

char* IdLabelParse(int id);

//
Таблица функций связи

static resmgr_connect_funcs_t connect_funcs;

// Таблица функций ввода/вывода

static resmgr_io_funcs_t io_funcs;

// Структура атрибутов устройства

static iofunc_attr_t attr;

main(int args, char **argv) {

resmgr_attr_t resmgr_attr; // Структура атрибутов менеджера ресурсов

dispatch_t *dpp; // Указатель на структуру диспетчеризации,

// содержит идентификатор канала.

dispatch_context_t *ctp; // Контекстная структура; содержит буфер

// сообщений, буфер векторов ввода/вывода

int id;

int result;

char BufferRec[100];

int rcvid;

setlocale(LC_CTYPE, "C-TRADITIONAL");

/* Здесь должны выполняться необходимые действия по инициализации

конкретного сервера */

/* Считаем, что все необходимое теперь выполнено... */

/* Инициализация интерфейса диспетчеризации */

if ((dpp = dispatch_create) == NULL) {

printf("%s: невозможно разместить обработчик"

" диспетчеризации.\n", argv[0]);

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 - заданные выше подпрограммы ввода/вывода;

Поделиться с друзьями: