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

Программа измерения полосы пропускания очереди System V

Программа измерения полосы пропускания очереди System V

В листинге А.7 приведен текст функции main, измеряющей полосу пропускания очередей сообщений System V, а в листинге А.8 текст функций reader и writer.

Листинг А.7. Функция main для измерения полосы пропускания очереди сообщений System V

//bench/bw_svmsg.c
1  #include "unpipc.h"
2  void reader(int, int, int);
3  void writer(int, int);
4  struct msgbuf *buf;
5  int totalnbytes, xfersize;
6  int
7  main(int argc, char **argv)
8  {
9   int i, nloop, contpipe[2], msqid;
10  pid_t childpid;
11  if (argc != 4)
12   err_quit("usage: bw_svmsg <#loops> <#mbytes> <#bytes/write>");
13  nloop = atoi(argv[1]);
14  totalnbytes = atoi(argv[2]) * 1024 * 1024;
15  xfersize = atoi(argv[3]);
16  buf = Valloc(xfersize);
17  Touch(buf, xfersize);
18  buf->mtype = 1;
19  Pipe(contpipe);
20  msqid = Msgget(IPC_PRIVATE, IPC_CREAT | SVMSG_MODE);
21  if ((childpid = Fork()) == 0) {
22   writer(contpipe[0], msqid); /* дочерний процесс */
23   exit(0);
24  }
25  Start_time();
26  for (i = 0; i < nloop; i++)
27   reader(contpipe[1], msqid, totalnbytes);
28  printf("bandwidth: %.3f MB/secn",
29  totalnbytes / Stop_time() * nloop);
30  kill(childpid, SIGTERM);
31  Msgctl(msqid, IPC_RMID, NULL);
32  exit(0);
33 }

Листинг А.8. Функции reader и writer

//bench/bw_svmsg.c
34 void
35 writer(int contfd, int msqid)
36 {
37  int ntowrite;
38  for (;;) {
39   Read(contfd, &ntowrite, sizeof(ntowrite));
40   while (ntowrite > 0) {
41    Msgsnd(msqid, buf, xfersize – sizeof(long), 0);
42    ntowrite –= xfersize;
43   }
44  }
45 }
46 void
47 reader(int contfd, int msqid, int nbytes)
48 {
49  ssize_t n;
50  Write(contfd, &nbytes, sizeof(nbytes));
51  while ((nbytes > 0) &&
52   ((n = Msgrcv(msqid, buf, xfersize – sizeof(long), 0, 0)) > 0)) {
53   nbytes –= n + sizeof(long);
54  }
55 }

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


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