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

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

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

Однако важным (по крайней мере, для программистов, не желающих отказываться от такого привычного и эффективного механизма передачи данных, как обмен сообщениями) является тот факт, что этот дескриптор на самом деле является не чем иным, как идентификатором соединения. И поэтому к серверу можно обращаться не только через высокоуровневые функции работы с файлами, но и с помощью элементарных функций обмена сообщениями MsgSend*()(элементарных, напомню, в том смысле, что в действительности все стандартные высокоуровневые функции работы с файлами реализованы через функции обмена сообщениями).

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

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

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

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

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

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

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

#define NET_OPER &quot;/net/904-3&quot;

#define NET_REG &quot;/net/Bed-Test&quot;

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

#define MESSIZE_MAX 100

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

#define PROC_NAME_MAX 100

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

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

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

} IdLabel[] = {

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

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

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

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

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

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

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

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

};

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

int ALLNUM_MYPROC = sizeof(IdLabel) /

                    sizeof(IdLabel[0]);

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

Как было сказано, клиент открывает файл (функция open()), после чего использует MsgSend(), отсылая сообщения и получая ответы.

#include &lt;stdio.h&gt;

#include &lt;stdlib.h&gt;

#include &lt;fcntl.h&gt;

#include &lt;sys/neutrino.h&gt;

#include &lt;sys/iomsg.h&gt;

#include &lt;locale.h&gt;

#include &lt;string.h&gt;

#include &quot;/home/ZZZ/TESTS/MR/MessTest.h&quot;

int main() {

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

 char BufferSend[MESSIZE_MAX], BufferReply[MESSIZE_MAX];

 setlocale(LC_CTYPE, &quot;C-TRADITIONAL&quot;);

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

  &quot;/dev/MESSTEST/RM&quot;), O_RDWR)) == -1)) {

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

  fflush(stdout);

  return(-1);

 }

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

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

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

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

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

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

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
Любимая книга