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

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

Жанры

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

}

/********************************************************************

Обработчик приватных сообщений, то есть сообщений, заголовок которых

укладывается в диапазон, указанный при вызове функции message_attach

********************************************************************/

int PrivatHandler(message_context_t* ctp, int code,

unsigned flags, void* handle) {

char Buffer[MESSIZE_MAX];

printf("получено
приватное сообщение тип %x от"

" \"%s\"\n", code, IdLabelParse(code));

printf("Вот это сообщение <<%s>>\n",

(char *)(ctp->msg) + 4);

strcpy(Buffer, "Клиенту: да, я такой");

MsgReply(ctp->rcvid, EOK, Buffer, sizeof(Buffer));

return(0);

}

/********************************************************************

Функция пользовательской библиотеки, определяющая инвентаризационное

имя процесса по его инвентаризационной метке

********************************************************************/

char* IdLabelParse(int id) {

struct IdLabel_t Inventory;

int i = 0;

while (IdLabel[i].id != id && i < ALLNUM_MYPROC) i++;

if (i == ALLNUM_MYPROC) return Anonymous;

else return(IdLabel[i].name);

}

Использование менеджера службы глобальных имен

Начиная с QNX версии 6.3 сервис глобальных имен, обеспечиваемый GNS-менеджером службы (утилитой

gns
), действует в сети. Используя этот сервис, нет необходимости организовывать программу как полноценный менеджер ресурсов, при этом приложение-сервер может объявлять свою службу, а приложения-клиенты могут отыскивать и использовать службы через QNET-сеть без знания таких частностей, как, например, где эта служба располагается и кто ее обеспечивает. Подробно о сервисе глобальных имен см. в [4].

Для того чтобы развернуть этот сервис, необходимо в режиме сервера запустить менеджер службы глобальных имен на том узле, где должно работать наше приложение-сервер. В режиме сервера GNS-менеджер выступает в роли некой центральной базы данных, хранящей объявленные службы, и обрабатывает запросы на поиск и установление связи с ними. На узле же, где располагается клиент, запускаем менеджер в режиме клиента, при этом он передает запросы объявления, поиска и установки связи между локальным (то есть расположенным на этом же узле) приложением-клиентом и сервером (серверами)

gns
.

Серверный узел:

# gns -s

Клиентский узел (узлы):

# gns -с

В результате на узлах, где запущены службы глобальных имен, появятся имена

/dev/name/global
и
/dev/name/local
.
Каждый узел, на котором запущен gns-клиент или сервер, в одной и той же сети имеет один и тот же вид пространства имен на
/dev/name/global
. Каждый узел имеет локальное пространство имен
/dev/name/local
, являющееся локальным для данной машины и отличающееся от локального пространства имен на другой машине. (Кстати, помимо имен
global
и
local
под
/dev/name/
появится еще имя
gns_server
или
gns_local
— имя, под которым регистрируется сам GNS-менеджер.)

Существует несколько функций API, относящихся к службе глобальных имен:

name_attach
,
name_open
и
name_close
. Программисты, знакомые с QNX 4, сразу «узнают» в них аналоги известных им функций
qnx_name_attach
,
qnx_name_open
и
qnx_name_close
. Приложения используют эти функции для объявления имени службы, связи со службой и отсоединения от службы.

Итак, чтобы объявить свое имя глобально в сети, приложение-сервер должно на узле, где в режиме сервера функционирует менеджер службы глобальных имен, объявить свою службу, выполнив вызов:

if (!(NameServer = name_attach(NULL, "MyService", NAME_FLAG_ATTACH_GLOBAL)))

return EXIT_FAILURE;

Флаг

NAME_FLAG_ATTACH_GLOBAL
указывает, что приложение-сервер объявляет свое имя глобально — в сети. Приложение, которое может подсоединить службу глобально, должно иметь право доступа
root
. После выполнения этого вызова в директории
/dev/name/global
появится подсоединенное имя
MyService
(если бы третий аргумент вызова был установлен в ноль, это имя оказалось бы подсоединенным к
/dev/name/local
и было бы доступно только локально).

Регистрируя имя в пространстве глобальных имен, функция

name_attach
создает канал, идентификатор которого она возвращает в составе структуры
NameServer
. Отметим, что этот канал создается с определенными установленными флагами, задающими соответствующие действия системе:

_NTO_CHF_UNBLOCK
— доставлять владельцу канала импульс с кодом
_PULSE_CODE_UNBLOCK
и значением
rcvid
каждый раз, когда Reply-блокированный клиент попытается разблокироваться (скажем, по получению сигнала или по таймеру);

_NTO_CHF_DISCONNECT
— доставлять владельцу канала импульс с кодом
_PULSE_CODE_DISCONNECT
, когда от процесса отсоединились все установленные соединения клиента (клиент выполнил
name_close
на каждый свой
name_open
к имени сервера либо вообще умер);

_NTO_CHF_COID_DISCONNECT
— доставлять владельцу канала импульс с кодом
_PULSE_CODE_COIDDEATH
и значением
coid
(идентификатора соединения) для каждого соединения по этому каналу, когда канал закрывается.

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

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

Соломенный Илья
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
рейтинг книги
Хуррит