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

Измерение задержки очередей сообщений System V

Измерение задержки очередей сообщений System V

В листинге А.16 приведен текст программы измерения времени задержки для очередей сообщений System V.

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

//bench/lat_svmsg.c
1  #include "unpipc.h"
2  struct msgbuf p2child = { 1, { 0 } }; /* type = 1 */
3  struct msgbuf child2p = { 2, { 0 } }; /* type = 2 */
4  struct msgbuf inbuf;
5  void
6  doit(int msgid)
7  {
8   Msgsnd(msgid, &p2child, 0, 0);
9   if (Msgrcv(msgid, &inbuf, sizeof(inbuf.mtext), 2, 0) != 0)
10   err_quit("msgrcv error");
11 }
12 int
13 main(int argc, char **argv)
14 {
15  int i, nloop, msgid;
16  pid_t childpid;
17  if (argc != 2)
18   err_quit("usage: lat_svmsg <#loops>");
19  nloop = atoi(argv[1]);
20  msgid = Msgget(IPC_PRIVATE, IPC_CREAT | SVMSG_MODE);
21  if ((childpid = Fork()) == 0) {
22   for(;;) { /* дочерний процесс */
23    if (Msgrcv(msgid, &inbuf, sizeof(inbuf.mtext), 1, 0) != 0)
24     err_quit("msgrcv error");
25    Msgsnd(msgid, &child2p, 0, 0);
26   }
27   exit(0);
28  }
29  /* родительский процесс */
30  doit(msgid);
31  Start_time();
32  for (i = 0; i < nloop; i++)
33   doit(msgid);
34  printf("latency: %.3f usecn", Stop_time() / nloop);
35  Kill(childpid, SIGTERM);
36  Msgctl(msgid, IPC_RMID, NULL);
37  exit(0);
38 }

Мы создаем одну очередь, по которой сообщения передаются в обоих направлениях. Сообщения с типом 1 передаются от родительского процесса дочернему, а сообщения с типом 2 — в обратную сторону. Четвертый аргумент при вызове msgrcv в функции doit имеет значение 2, что обеспечивает получение сообщений только данного типа. Аналогично в дочернем процессе четвертый аргумент msgrcv имеет значение 1.

ПРИМЕЧАНИЕ

В разделах 9.3 и 11.3 мы отмечали, что многие структуры, определенные в ядре, нельзя инициализировать статически, поскольку стандарты Posix.1 и Unix 98 гарантируют лишь наличие определенных полей в этих структурах, но не определяют ни их порядок, ни наличие других полей. В этой программе мы инициализируем структуру msgbuf статически, поскольку очереди сообщений System V гарантируют, что эта структура содержит поле типа сообщения long, за которым следуют передаваемые данные.

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


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