else

  printf('Родитель, мой id = %i,'

   'порожденный процесс имеет id = %i ', procid, childid);

 if ((rcvid = MsgReceive(PChanid, RecBuffer, 100, NULL)) == -1)

  printf('Родитель: от дитятки не удалось'

   ' получить сообщение ');

 else {

  printf('Родитель: от дитятки получено'

   ' сообщение:'%s' ', RecBuffer);

  CChanid = atoi(RecBuffer);

  strcpy(RecBuffer, 'спасибо, сынок');

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

   printf('Родитель: почему-то не удалось '

    'ответить сыночку: Ау, где ты? ');

 }

 if ((coid =

  ConnectAttach(nid, childid, CChanid, _NTO_SIDE_CHANNEL, 0)) == -1) {

  printf('Родитель: странно, но не смог установить'

   ' канал связи с ребенком:'

   'nid = %i childid = %i CChanid = %i ', nid, childid, CChanid);

  return(-1);

 }

 printf('Родитель: установил связь coid = %i с'

  ' ребенком ', coid);

 errno = 0;

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

  printf('Родитель: на MsgSend получил errno = %i ', errno);

 else

  printf('Родитель, получен отклик на MsgSend()'

   ', '%s' ', SendBuf);

 printf('Родитель: позвольте откланяться ');

 ChannelDestroy(Pchanid);

 ConnectDetach(CChanid);

 return(0);

}

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

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

#include <string.h>

#include <process.h>

#include <sys/netmgr.h>

#include <sys/neutrino.h>

#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('Ребенок: странно, но не удалось создать'

   ' канал ');

 else

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

 Parpid = atoi(argv[1]);

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

  ' Parpid = %i ', Parpid);

 strcpy(BufName, '904-3');

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

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

 else

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

 if ((coid =

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

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

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

  return(-1);

 }

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

  ' Parpid = %i на узле %i ', coid, Parpid, nid);

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

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

 itoa(CChanid, SendBuf, 10);

 errno = 0;

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

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

   ' errno = %i ', errno);

 else

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

   ' от родителя.'%s' ', SendBuf);

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

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

  ' '%s' ', RecBuf);

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

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

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

   ' папаше. Ау, где ты? ');

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату
×