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

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 88 89 90 91 92 93 94 95 96 ... 106
Перейти на страницу:

   exit(&quot;block error&quot;);

  dispatch_handler(ctp);

 }

}

// размер буфера для обмена сообщениями,

// этого нам хватит с большим запасом и надолго ;)

const int blk = 100000;

// обработчик низкоуровневых сообщений,

// также работающий в отдельном потоке

void* msginout(void* с) {

 static uint8_t bufin[blk];

 struct _msg_info info;

 while (true) {

  int rcvid = MsgReceive(data chid, &amp;bufin, blk, &amp;info);

  if (rcvid &lt; 0) exit(&quot;message receive&quot;);

  if (MsgReply(rcvid, EOK, &amp;bufin, info.msglen) &lt; 0)

  exit(&quot;message reply&quot;);

 }

}

//--------------------------------------------------------

// &quot;пустой&quot; обработчик реакции на ^C (сигнал SIGINT)

inline static void empty(int signo) {}

//--------------------------------------------------------

// главная программа, которая все это &quot;хозяйство&quot; установит

// и будет безропотно ждать завершения по ^C ;)

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

 cout &lt;&lt; &quot;SRR server: &quot; &lt;&lt; VERSION &lt;&lt; endl;

 // открывается менеджер ресурса ...

 int fd = open(DEVNAME, O_RDONLY);

 // если менеджер открылся, то это нам не нужно -

 // дубликаты не создавать!

 if (fd &gt; 0)

  close(fd), cout &lt;&lt; &quot;already in use &quot; &lt;&lt; DEVNAME &lt;&lt; endl, exit(EXIT_FAILURE);

 // перехватываем реакцию ^C:

 cout &lt;&lt; &quot;. . . . . . waiting ^C. . . . . .&quot; &lt;&lt; flush;

 signal(SIGINT, empty);

 // создается канал для обмена низкоуровневыми сообщениями

 data.chid = ChannelCreate(0);

 // и запускается отдельным потоком ретранслятор с этого канала

 if (pthread_create(NULL, NULL, msginout, NULL) != EOK)

  exit(&quot;message thread&quot;);

 // запускается менеджер ресурса

 if (pthread_create(NULL, NULL, install, NULL) != EOK)

  exit(&quot;manager thread&quot;);

 // ... все! Мы свое дело сделали и ожидаем ^C ...

 pause();

 cout &lt;&lt; &quot;rFinalization... &quot; &lt;&lt; endl;

 // ... очистка, завершение ...

 ChannelDestroy(data.chid);

 return EXIT_SUCCESS;

}

Первая клиентская программа ( файл cli.cc) посылает серверу блок данных указанной длины (длина может изменяться в широких пределах указанием при запуске ключа -b) и ожидает от него ретрансляции, после чего замеряет время ответа от сервера. Этот процесс повторяется многократно (ключ -m).

Первый клиентский процесс

#include &quot;common.h&quot;

static uint64_t *tim;

static int num = 10;

// вывод результатов с оценкой статистики: среднее, С.К.О...

static void outtim(void) {

 double m = 0., s = 0.;

 for (int i = 0; i &lt; num; i++) {

  double d = (double)tim[i];

  m += d;

  s += d * d;

 }

 m /= num;

 s = sqrt(s / num - m * m);

 cout &lt;&lt; 't' &lt;&lt; (uint64_t)floor(m + 5) &lt;&lt; &quot;t~&quot; &lt;&lt; (uint64_t)floor(s + .5) &lt;&lt;

  &quot;t{&quot; &lt;&lt; (uint64_t)floor(s / m * 100 + .5) &lt;&lt; &quot;%}&quot; &lt;&lt; endl;

}

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

 cout &lt;&lt; &quot;SRR client: &quot; &lt;&lt; VERSION &lt;&lt; endl;

 int opt, val;

 unsigned int blk = 100;

 char PATH[_POSIX_PATH_MAX] = &quot;&quot;;

 while ((opt = getopt(argc, argv, &quot;n:b:m:&quot;)) != -1) {

  switch (opt) {

  case 'n': // имя хоста сервера

   strcpy(PATH, &quot;/net/&quot;);

   strcat(PATH, optarg);

   break;

  case 'b': // размер блока обмена (байт)

   if (sscanf(optarg, &quot;%i&quot;, &amp;blk) != 1)

    exit(&quot;parse command line failed&quot;);

   break;

1 ... 88 89 90 91 92 93 94 95 96 ... 106
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга