Книга: UNIX: взаимодействие процессов

Программа измерения задержки очередей сообщений Posix

Программа измерения задержки очередей сообщений Posix

Пpoгрaммa измерения задержки для очередей сообщений Posix приведена в листинге А.15.

Листинг А. 15. Программа измерения задержки для очереди сообщений Posix

//bench/lat_pxmsg.с
1  #include "unpipc.h"
2  #define NAME1 "lat_pxmsg1"
3  #define NAME2 "lat_pxmsg2"
4  #define MAXMSG 4 /* место для 4096 байт в очереди */
5  #define MSGSIZE 1024
6  void
7  doit(mqd_t mqsend, mqd_t mqrecv)
8  {
9   char buff[MSGSIZE];
10  Mq_send(mqsend, buff, 1.0);
11  if (Mq_receive(mqrecv, buff, MSGSIZE, NULL) != 1)
12   err_quit("mq_receive error");
13 }
14 int
15 main(int argc, char **argv)
16 {
17  int i, nloop;
18  mqd_t mq1, mq2;
19  char buff[MSGSIZE];
20  pid_t childpid;
21  struct mq_attr attr;
22  if (argc != 2)
23   err_quit("usage: lat_pxmsg <#loops>");
24  nloop = atoi(argv[1]);
25  attr.mq_maxmsg = MAXMSG;
26  attr.mq_msgsize = MSGSIZE;
27  mq1 = Mq_open(Px_ipc_name(NAME1), O_RDWR | O_CREAT, FILE_MODE, &attr);
28  mq2 = Mq_open(Px_ipc_name(NAME2), O_RDWR | O_CREAT, FILE_MODE, &attr);
29  if ((childpid = Fork()) == 0) {
30   for(;;) { /* дочерний процесс */
31    if (Mq_receive(mq1, buff, MSGSIZE, NULL) != 1)
32     err_quit("mq_receive error");
33    Mq_send(mq2, buff, 1.0);
34   }
35   exit(0);
36  }
37  /* родительский процесс */
38  doit(mq1, mq2);
39  Start_time();
40  for (i = 0; i < nloop; i++)
41   doit(mq1, mq2);
42  printf("latency: %.3f usecn", Stop_time() / nloop);
43  Kill(childpid, SIGTERM);
44  Mq_close(mq1);
45  Mq_close(mq2);
46  Mq_unlink(Px_ipc_name(NAMED);
47  Mq_unlink(Px_ipc_name (NAME2));
48  exit(0);
49 }

25-28 Создаются две очереди сообщений, каждая из которых используется для передачи данных в одну сторону. Хотя для очередей Posix можно указывать приоритет сообщений, функция mq_receive всегда возвращает сообщение с наивысшим приоритетом, поэтому мы не можем использовать лишь одну очередь для данного приложения.

Оглавление книги


Генерация: 1.266. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз