Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Интернет » QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович
<< На главную

QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович

Читать онлайн QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 96 97 98 99 100 101 102 103 104 ... 106
Перейти на страницу:

 ChannelDestroy(Pchanid);

 ConnectDetach(CChanid);

 return(0);

}

Пример кода порожденного процесса

#include &lt;stdio.h&gt;

#include &lt;unistd.h&gt;

#include &lt;sys/types.h&gt;

#include &lt;string.h&gt;

#include &lt;process.h&gt;

#include &lt;sys/netmgr.h&gt;

#include &lt;sys/neutrino.h&gt;

#include &lt;errno.h&gt;

#include &lt;locale.h&gt;

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, &quot;C-TRADITIONAL&quot;);

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

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

   &quot; каналn&quot;);

 else

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

 Parpid = atoi(argv[1]);

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

  &quot; Parpid = %in&quot;, Parpid);

 strcpy(BufName, &quot;904-3&quot;);

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

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

 else

  printf(&quot;Ребенок: узел &quot;%s&quot; найден, его nid = %in&quot;, BufName, nid);

 if ((coid =

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

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

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

  return(-1);

 }

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

  &quot; Parpid = %i на узле %in&quot;, coid, Parpid, nid);

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

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

 itoa(CChanid, SendBuf, 10);

 errno = 0;

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

  printf(&quot;Ребенок: на MsgSend() к отцу получил&quot;

   &quot; errno = %in&quot;, errno);

 else

  printf(&quot;Ребенок: на MsgSend() получен отклик&quot;

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

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

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

  &quot; &quot;%s&quot;n&quot;, RecBuf);

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

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

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

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

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

 ChannelDestroy(CChanid);

 ConnectDetach(coid);

 return(0);

}

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

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

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

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

1 ... 96 97 98 99 100 101 102 103 104 ... 106
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга