Код процесса-клиента, использующего службу глобальных имен
#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 с.
6. Теренс Чан «Системное программирование на C++ для UNIX». — К.: Издательская группа BHV, 1997. — 592 с.
7. Андрей Робачевский «Операционная система UNIX». — СПб.: BHV-Санкт-Петербург, 1997. — 528 с.
8. «QNX Neutrino Realtime Operating System. System Architecture». — QNX Software Systems Ltd, 2002.
9. Йон Снейдер «Эффективное программирование TCP/IP». — СПб.: Питер, 2001. — 320 с.
10. Э. Дейкстра «Взаимодействие последовательных процессов», сборник «Языки программирования» под ред. Ф. Женюи. — М.: Мир, 1972.
11. Стивен Янг «Алгоритмические языки реального времени. Конструирование и разработка». — М.: Мир, 1985. — 400 с.
12. Марк Митчелл, Джеффри Оулдем, Алекс Самьюэл «Программирование для Linux. Профессиональный подход». — М.: Издательский дом «Вильямс», 2002. — 288 с.
13. С. L. Liu and J.W. Layland «Scheduling Algorithms for Multiprogramming in a Hard Real-Time Environment», J. CM, Vol. 20, No. 1, Jan.1973, pp. 46-61.
14. The Open Group Base Specifications Issue 6, IEEE Std 1003.1-2001. General Information. Copyright 2001 The IEEE and The Open Group.