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

Программа измерения задержки интерфейса дверей

Программа измерения задержки интерфейса дверей

Пpoгрaммa измерения задержки для интерфейса дверей дана в листинге А.17. Дочерний процесс создает дверь и связывает с ней функцию server. Родительский процесс открывает дверь и вызывает door_call в цикле. В качестве аргумента передается 1 байт данных, и ничего не возвращается.

Листинг А.17. Программа измерения задержки интерфейса дверей

//bench/lat_door.c
1  #include "unpipc.h"
2  void
3  server(void *cookie, char *argp, size_t arg_size,
4   door_desc_t *dp, size_t n_descriptors)
5  {
6   char c;
7   Door_return(&c, sizeof(char), NULL, 0);
8  }
9  int
10 main(int argc, char **argv)
11 {
12  int i, nloop, doorfd, contpipe[2];
13  char c;
14  pid_t childpid;
15  door_arg_t arg;
16  if (argc != 3)
17   err_quit("usage: lat_door <pathname> <#loops>");
18  nloop = atoi(argv[2]);
19  unlink(argv[1]);
20  Close(Open(argv[1], O_CREAT | O_EXCL | O_RDWR, FILE_MODE));
21  Pipe(contpipe);
22  if ((childpid = Fork()) == 0) {
23   doorfd = Door_create(server, NULL, 0);
24   Fattach(doorfd, argv[1]);
25   Write(contpipe[1], &c, 1);
26   for(;;) /* дочерний процесс = сервер */
27    pause();
28   exit(0);
29  }
30  arg.data_ptr = &c; /* родительский процесс = клиент */
31  arg.data_size = sizeof(char);
32  arg.desc_ptr = NULL;
33  arg.desc_num = 0;
34  arg.rbuf = &c;
35  arg.rsize = sizeof(char);
36  if (Read(contpipe[0], &c, 1) != 1) /* ждем создания */
37   err_quit("pipe read error");
38  doorfd = Open(argv[1], O_RDWR);
39  Door_call(doorfd, &arg); /* запуск */
40  Start_time();
41  for (i = 0; i < nloop; i++)
42   Door_call(doorfd, &arg);
43  printf("latency: %.3f usecn", Stop_time() / nloop);
44  Kill(childpid, SIGTERM);
45  unlink(argv[1]);
46  exit(0);
47 }

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


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