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

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

Жанры

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

#include <errno.h>

#include <locale.h>

int main(int argc, char **argv) {

int nid; // Дескриптор текущего узла

int CChanid; // Идентификатор созданного канала

int coid; // Идентификатор связи с родителем

// по созданному им каналу

pid_t Parpid; // Идентификатор
родительского процесса

int rcvid; // Идентификатор отправителя

// полученного сообщения

char BufName[100];

char SendBuf[100], RecBuf[100];

setlocale(LC_CTYPE, "C-TRADITIONAL");

if ((CChanid = ChannelCreate(0)) == -1)

printf("Ребенок: странно, но не удалось создать"

" канал\n");

else

printf("Ребенок: канал CChanid = %i создан\n", CChanid);

Parpid = atoi(argv[1]);

printf("Ребенок сообщает: он жив благодаря папане"

" Parpid = %i\n", Parpid);

strcpy(BufName, "904-3");

if ((nid = netmgr_strtond(BufName, NULL)) == -1)

printf("Ребенок: узел \"%s\" не найден!\n", BufName);

else

printf("Ребенок: узел \"%s\" найден, его nid = %i\n", BufName, nid);

if ((coid =

ConnectAttach(nid, Parpid, atoi(argv[2]), _NTO_SIDE_CHANNEL, 0)) == -1) {

printf("Ребенок: странно, но дитя не смогло"

" установить канал связи с папаней\n");

return(-1);

}

printf("Ребенок: установил связь coid = %i с процессом"

" Parpid = %i на узле %i\n", coid, Parpid, nid);

// Вот здесь хорошее место, чтобы выполнить все действия,

// необходимые для развертывания данного процесса

itoa(CChanid, SendBuf, 10);

errno = 0;

if (MsgSend(coid, SendBuf, 100, SendBuf, 100) == -1)

printf("Ребенок: на MsgSend к отцу получил"

" errno = %i\n", errno);

else

printf("Ребенок: на MsgSend получен отклик"

" от родителя.\"%s\"\n", SendBuf);

rcvid = MsgReceive(CChanid, RecBuf, 100, NULL);

printf("Ребенок:
от папани получено сообщение:"

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

strcpy(RecBuf, "я здесь, папаня!");

if (MsgReply(rcvid, EOK, RecBuf, 100) == -1)

printf("Ребенок: почему-то не удалось ответить"

" папаше. Ау, где ты?\n");

printf("Ребенок: дитятко работу закончило\n");

ChannelDestroy(CChanid);

ConnectDetach(coid);

return(0);

}

Обмен сообщениями на основе менеджера ресурсов

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

nameloc
. Сервер объявлял свое имя в пространстве имен с помощью функции
qnx_name_attach
, а затем клиент, вызвав функцию
qnx_name_locate
, получал от системы идентификатор сервера, по которому мог далее с ним общаться.

Разработчики QNX 6 настоятельно рекомендуют вместо использования службы имен выполнять сервер в виде менеджера ресурсов, причем настолько настоятельно, что до версии 6.3 аналог этой службы — менеджер службы глобальных имен

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

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

open
. Получив в результате выполнения этой функции дескриптор файла, они затем могут обращаться к серверу, используя стандартные библиотечные функции С, такие как
read
,
write
и т.д.

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

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

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

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Отчий дом. Семейная хроника

Чириков Евгений Николаевич
Проза:
классическая проза
5.00
рейтинг книги
Отчий дом. Семейная хроника

Скандальная свадьба

Данич Дина
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Скандальная свадьба

Путанабус. Трилогия

Старицкий Дмитрий
Фантастика:
боевая фантастика
6.93
рейтинг книги
Путанабус. Трилогия

Идеальный мир для Лекаря 25

Сапфир Олег
25. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 25

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Проданная невеста

Wolf Lita
Любовные романы:
любовно-фантастические романы
5.80
рейтинг книги
Проданная невеста

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

С Д. Том 16

Клеванский Кирилл Сергеевич
16. Сердце дракона
Фантастика:
боевая фантастика
6.94
рейтинг книги
С Д. Том 16

Переиграть войну! Пенталогия

Рыбаков Артем Олегович
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
Переиграть войну! Пенталогия

От Советского Информбюро - 1941-1945 (Сборник)

Неизвестен 3 Автор
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
От Советского Информбюро - 1941-1945 (Сборник)

Санек 3

Седой Василий
3. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 3

Прометей: повелитель стали

Рави Ивар
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Прометей: повелитель стали

Отмороженный 14.0

Гарцевич Евгений Александрович
14. Отмороженный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Отмороженный 14.0