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

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

Жанры

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*
(элементарных, напомню, в том смысле, что в действительности все стандартные высокоуровневые функции работы с файлами реализованы через функции обмена сообщениями).

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

Огни Эйнара. Долгожданная

Макушева Магда
1. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Огни Эйнара. Долгожданная

Real-Rpg. Еретик

Жгулёв Пётр Николаевич
2. Real-Rpg
Фантастика:
фэнтези
8.19
рейтинг книги
Real-Rpg. Еретик

Вперед в прошлое 2

Ратманов Денис
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 2

Как я строил магическую империю

Зубов Константин
1. Как я строил магическую империю
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю

Возвращение Безумного Бога 5

Тесленок Кирилл Геннадьевич
5. Возвращение Безумного Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Возвращение Безумного Бога 5

Ненужная жена

Соломахина Анна
Любовные романы:
любовно-фантастические романы
5.86
рейтинг книги
Ненужная жена

Идеальный мир для Социопата 6

Сапфир Олег
6. Социопат
Фантастика:
боевая фантастика
рпг
6.38
рейтинг книги
Идеальный мир для Социопата 6

Вечный. Книга II

Рокотов Алексей
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга II

Мимик нового Мира 6

Северный Лис
5. Мимик!
Фантастика:
юмористическая фантастика
попаданцы
рпг
5.00
рейтинг книги
Мимик нового Мира 6

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

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

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

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя

Разведчик. Заброшенный в 43-й

Корчевский Юрий Григорьевич
Героическая фантастика
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.93
рейтинг книги
Разведчик. Заброшенный в 43-й

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

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