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

на главную - закладки

Жанры

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

Вместе с тем следует учитывать, что менеджер ресурсов поставляется для программиста фактически в готовом виде — как шкаф, то есть уже имеются все отделения, полки, ножки, дверцы, и задача разработчика - лишь заполнить его своим содержимым. Однако «навесить» на него свою полочку уже невозможно. Иными словами, при передаче сообщений с использованием менеджера ресурсов необходимо применять уже имеющиеся средства менеджера ресурсов, благо их вполне достаточно.

Самым очевидным и наиболее простым способом передачи сообщений к серверу является инкапсуляция сообщений в «сообщения управления устройством» —

сообщения типа
devctl
. Однако этот способ имеет существенный недостаток, заключающийся в том, что при взаимном обмене данными между сервером и клиентом, что является более общим и достаточно частым случаем, мы вынуждены передавать в обоих направлениях буферы одинаковой длины. Это объясняется тем, что функция
devctl
имеет только один параметр для размеров обоих буферов. Поэтому в качестве универсального средства передачи сообщений применение этой функции выглядит непривлекательным.

К радости разработчиков, менеджер ресурсов предлагает функцию приватных сообщений

io_msg
для сообщений типа
_IO_MSG
. Менеджер способен их обрабатывать после соответствующей «настройки», заключающейся в подключении диапазона сообщений, интерпретируемых как приватные (допустимые значения должны быть больше
0x1ff
— диапазона, резервируемого за системой). При этом сервер в состоянии как сразу «отпустить» Reply-блокированного клиента, так и оставить его в этом состоянии до нужного момента.

Ниже приводится код процесса-клиента и процесса-сервера. Последний представляет собой стандартный менеджер ресурсов — в таком виде, в каком он, так сказать, поставляется разработчику. Единственная шляпа, помещаемая в этот шкаф, — это обработчик приватных сообщений. Здесь вы и должны поместить специфический код обработки принятого сообщения.

В остальном все достаточно тривиально. Более подробно о том, как писать менеджеры ресурсов, можно прочитать в главе «Writing a Resource Manager» технической документации QNX, а также в книгах [1] и [4] (глава Олега Цилюрика «Драйверы»).

Пример обмена сообщениями с помощью менеджера ресурсов

Код файла заголовков

#define NET_OPER "/net/904-3"

#define NET_REG "/net/Bed-Test"

// Максимальная длина обычного стандартного сообщения.

#define MESSIZE_MAX 100

// Максимальная длина инвентаризационного имени процесса

#define PROC_NAME_MAX 100

struct IdLabel_t { // Структура, содержащая,

int id; // -.инвентаризационную метку процесса

char name[PROC_NAME_MAX]; // - инвентаризационное имя процесса

} IdLabel[] = {

/* диапазон выделенный Группе # 1: от 0x5000 до 0x50ff */

0x5001, "пробный менеджер ресурсов",

0x5002, "первый
тестовый клиент для менеджера ресурсов",

0x5003, "второй тестовый клиент для менеджера ресурсов",

0x5004, "третий тестовый клиент для менеджера ресурсов",

0x50ff, "четвертый тестовый клиент для менеджера ресурсов"

/* диапазон, выделенный Группе # 2: от 0x5100 до 0x51ff */

/* диапазон, выделенный Группе # 3: от 0x5200 до 0x52ff */

};

char Anonymous[] = "чуждый процесс";

int ALLNUM_MYPROC = sizeof(IdLabel) /

sizeof(IdLabel[0]);

Код процесса-клиента

Как было сказано, клиент открывает файл (функция

open
), после чего использует
MsgSend
, отсылая сообщения и получая ответы.

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <sys/neutrino.h>

#include <sys/iomsg.h>

#include <locale.h>

#include <string.h>

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

int main {

int fdRM; // Дескриптор соединения с менеджером ресурсов

char BufferSend[MESSIZE_MAX], BufferReply[MESSIZE_MAX];

setlocale(LC_CTYPE, "C-TRADITIONAL");

if (fdRM = open(strcat(strcpy(BufferSend, NET_REG),

"/dev/MESSTEST/RM"), O_RDWR)) == -1)) {

printf("Клиент не нашел имени менеджера!\n");

fflush(stdout);

return(-1);

}

/* Заполнение заголовка - первых 4-х байт сообщения, содержащего

инвентаризационную метку данного процесса (описаны в "IRL32.h") */

((int *)(BufferSend))[0] = 0x5002;

/* Заполнение сообщения */

strcpy(BufferSend + 4, "Так вот ты какой, Менеджер Ресурсов!");

if (MsgSend(fdRM, BufferSend, 100, BufferReply, 100) == -1)

printf("Клиенту не удалось передать сообщение\n");

else

printf("Клиент передал сообщение и получил <%s>\n", BufferReply);

Поделиться:
Популярные книги

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Привет из Загса. Милый, ты не потерял кольцо?

Лисавчук Елена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Привет из Загса. Милый, ты не потерял кольцо?

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Убивать чтобы жить 7

Бор Жорж
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 7

У врага за пазухой

Коваленко Марья Сергеевна
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
У врага за пазухой

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит