Ниже приводится код процесса-клиента и процесса-сервера. Последний представляет собой стандартный менеджер ресурсов — в таком виде, в каком он, так сказать, поставляется разработчику. Единственная шляпа, помещаемая в этот шкаф, — это обработчик приватных сообщений. Здесь вы и должны поместить специфический код обработки принятого сообщения.
В остальном все достаточно тривиально. Более подробно о том, как писать менеджеры ресурсов, можно прочитать в главе «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
#include
#include
#include
#include
#include
#include
#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);
fflush(stdout);
close(fdRM);
return(0);
}
Код процесса-сервера (менеджера ресурсов)
Для запуска сервера на удаленном узле выполните с терминала команду:
# on -f /net/Bed-Test /net/904-3/home/ZZZ/BIN/TestMGR
где
Bed-Test
— имя удаленного узла,
904-3
— имя локального узла,
/home/ZZZ/BIN/TestMGR
— путь к исполняемому файлу.