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

на главную

Жанры

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

} else {

printf("Сервер получил сообщение. \"%s\"\n",

MsgBuf.Buffer);

strcpy(BufReply, "а, это ты, клиент");

}

MsgReply(rcvid, EOK, BufReply, strlen(BufReply) + 1);

}

// Конец петли получения сообщений

/* Отсоединяемся от службы глобальных имен */

name_detach(NameServer, 0);

return EXIT_SUCCESS;

}

Приложения-клиенты,

которым надо использовать глобальную службу имен, могут использовать функцию API
name_open
. В случае, когда служба обеспечивается несколькими серверами (интересная и очень полезная возможность, заключающаяся в том, что несколько серверов вправе на различных узлах сети объявить одну и ту же службу), правила связи со службой имен таковы:

• Если поставщик службы имеется на том же узле, что и приложение, запросившее службу, менеджер пытается связать приложение прежде всего с локальным поставщиком. Если связь успешна, приложение общается со своим поставщиком локально, что обеспечивает лучшую производительность.

• Если локальный поставщик отсутствует или по каким-то причинам отказывает в поставке службы, менеджер пытается связать приложение с другими поставщиками. Если имеется несколько удаленных поставщиков, то порядок, в котором производятся попытки установить с ними связь (т.е. кто получит связь первым), не определен.

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

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <sys/dispatch.h>

/* На сервер могут приходить и импульсы. Как минимум. */

typedef struct _pulse msg_header_t;

/* Структура сообщения состоит из заголовка и буфера наших данных */

typedef struct _MsgBuf {

msg_header_t hdr;

char* Buffer;

} MsgBuf_t;

int main {

MsgBuf_t MsgBuf;

int fd;

char BufReply[100];

if ((fd = name_open("MyService", NAME_FLAG_ATTACH_GLOBAL)) == -1) {

printf("Клиенту не удалось присоединиться к"

" сервису\n");

fflush(stdout);

return EXIT_FAILURE;

}

// Инвентаризационная метка данного клиента

MsgBuf.hdr.type = 0x50001;

MsgBuf.hdr.subtype = 0x00;

strcpy (MsgBuf.Buffer, "Здравствуй,
дорогой сервер!");

if (MsgSend(fd, &MsgBuf, sizeof MsgBuf, BufReply, sizeof BufReply) == -1) {

printf("Клиент имеет проблемы с передачей сообщений"

" серверу\n");

fflush(stdout);

name_close(fd);

return EXIT_FAILURE;

}

printf("Клиент получил от сервера такой ответ: "

"\"%s\" \n", BufReply);

name_close(fd);

return EXIT_SUCCESS;

}

Тем, кто уже использовал функции работы со службой глобальных имен в предыдущей реализации ОС QNX 6.2 (где, как указывалось выше, она уже существовала, но могла функционировать только локально), следует обратить внимание, что в поведении этих функций появились небольшие изменения.

Раньше, когда приложение-клиент использовало вызов функции

name_open
для связи с сервером, сервер об этом не знал. Теперь это изменено: серверу фактически отсылается сообщение
_IO_CONNECT
/
_IO_OPEN
. Кроме того, изменено приложение-сервер, чтобы иметь возможность обрабатывать приход сообщения
_IO_CONNECT
.

Заключение

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

Конечно, первый из рассмотренных методов является самым «спартанским» и поэтому наиболее эффективным по действию, однако и наиболее «хрупким», требующим внимательного обустройства, а также мало приемлемым в больших системах. Лично мне больше импонирует второй метод, но боюсь, что это просто личные пристрастия (возможно, нравится потому, что лентяю не может не доставлять удовольствия тот факт, что предлагается уже готовый прототип менеджера ресурсов, и самому надо делать совсем немного...). Выбирайте то, что больше всего нравится вам и более всего подходит для вашей конкретной задачи.

Литература

1. Роб Кертен «Введение в QNX/Neutrino 2». — СПб.: Петрополис, 2001. — 478 с.

2. Уильям Стивенс «UNIX: взаимодействие процессов». — СПб.: Питер, 2002. — 576 с.

3. Уильям Стивенс «UNIX: разработка сетевых приложений». — СПб.: Питер, 2003. — 1086 с.

4. Алексеев, Видревич, Волков, Горошко, Горчак, Жавнис, Сошин, Цилюрик, Чиликин «Практика работы с QNX». — М.: КомБук, 2004. — 432 с.

5. Кэйт Хэвиленд, Дайна Грей, Бен Салама «Системное программирование в UNIX». — М.: ДМК Пресс, 2000. — 368 с.

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

Не отпускаю

Шагаева Наталья
Любовные романы:
современные любовные романы
эро литература
8.44
рейтинг книги
Не отпускаю

Прометей: Неандерталец

Рави Ивар
4. Прометей
Фантастика:
героическая фантастика
альтернативная история
7.88
рейтинг книги
Прометей: Неандерталец

Брачный сезон. Сирота

Свободина Виктория
Любовные романы:
любовно-фантастические романы
7.89
рейтинг книги
Брачный сезон. Сирота

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9

Новая мама в семье драконов

Смертная Елена
2. В доме драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Новая мама в семье драконов

Ох уж этот Мин Джин Хо 2

Кронос Александр
2. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 2

Звезда Чёрного Дракона

Джейн Анна
2. Нежеланная невеста
Любовные романы:
любовно-фантастические романы
4.40
рейтинг книги
Звезда Чёрного Дракона

Опер. Девочка на спор

Бигси Анна
5. Опасная работа
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Опер. Девочка на спор

Всадник Системы

Poul ezh
2. Пехотинец Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Всадник Системы

Ты не мой Boy 2

Рам Янка
6. Самбисты
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Ты не мой Boy 2

Жестокая свадьба

Тоцка Тала
Любовные романы:
современные любовные романы
4.87
рейтинг книги
Жестокая свадьба

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Защитник

Астахов Евгений Евгеньевич
7. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Защитник