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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 95 96 97 98 99 100 101 102 103 ... 106

#include <process.h>

#include <sys/neutrino.h>

#include <sys/netmgr.h>

#include <spawn.h>

#include <errno.h>

#include <unistd.h>

#include <sys/wait.h>

#include <locale.h>

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

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

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

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

              // порожденным процессом на удаленном узле

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

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

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

              // сообщения int

 ErrCode;     // Код ошибки

 char *args[] = {

  "/net/904-3/home/ZZZ/BIN/TestChild",

  "pid данного процесса",

  "идентификатор канала",

  NULL

 };

 char BufName[100], Bufpid[12],

  Bufchanid[12], RecBuffer[100];

 char SendBuf[100] = "привет, сынок!";

 pid_t procid, childid;

 struct inheritance Inhproc;

 setlocale(LC_CTYPE, "C-TRADITIONAL");

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

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

   "создать каналn");

 else printf("Родитель: канал PChanid = %i созданn", PChanid);

 strcpy(BufName, "Bed-Test");

 // Передаем порожденному процессу свой pid...

 args[1] = itoa(procid = getpid(), Bufpid, 10);

 // ... и дескриптор канала

 args[2] = itoa(PChanid, Bufchanid, 10);

 InhProc flags = SPAWN_SETND | SPAWN_NOZOMBIE;

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

  printf("Родитель, отсутствует %sn", BufName);

  return(-1);

 } else printf("Родитель: найден узел %s, его nid = %in", BufName, nid);

 InhProc nd = nid;

 sprintf(BufName, "/net/Bed-Test/");

 chroot(BufName);

 errno = 0;

 childid = spawn(args[0], 0, NULL, &InhProc, args, NULL);

 ErrCode = errno;

 sprintf(BufName, "/net/904-3/");

 chroot(BufName);

 if (childid- = -1)

  printf("Родитель: не удалось породить процесс,"

   " errno = %in", ErrCode);

 else

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

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

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

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

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

 else {

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

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

  CChanid = atoi(RecBuffer);

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

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

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

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

 }

 if ((coid =

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

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

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

   "nid = %i childid = %i CChanid = %in", nid, childid, CChanid);

  return(-1);

 }

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

  " ребенкомn", coid);

 errno = 0;

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

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

 else

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

   ", "%s"n", SendBuf);

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

1 ... 95 96 97 98 99 100 101 102 103 ... 106
На этой странице вы можете бесплатно читать книгу QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович бесплатно.

Оставить комментарий