Листинг А.9. Функция main измерения полосы пропускания интерфейса дверей
//bench/bw_door.c
1 #include "unpipc.h"
2 void reader(int, int);
3 void writer(int);
4 void server(void *, char *, size_t, door_desc_t *, size_t);
5 void *buf;
6 int totalnbytes, xfersize, contpipe[2];
7 int
8 main(int argc, char **argv)
9 {
10 int i, nloop, doorfd;
11 char c;
12 pid_t childpid;
13 ssize_t n;
14 if (argc != 5)
15 err_quit("usage: bw_door
16 nloop = atoi(argv[2]);
17 totalnbytes = atoi(argv[3]) * 1024 * 1024;
18 xfersize = atoi(argv[4]);
19 buf = Valloc(xfersize);
20 Touch(buf, xfersize);
21 unlink(argv[1]);
22 Close(Open(argv[1], O_CREAT | O_EXCL | O_RDWR, FILE_MODE));
23 Pipe(contpipe); /* предполагается наличие двустороннего канала SVR4 */
24 if ((childpid = Fork()) == 0) {
25 /* дочерний процесс = клиент */
26 if ((n = Read(contpipe[0], &c, 1)) != 1)
27 err_quit("child: pipe read returned %d", n);
28 doorfd = Open(argv[1], O_RDWR);
29 writer(doorfd);
30 exit(0);
31 }
32 /* родительский процесс = сервер */
33 doorfd = Door_create(server, NULL, 0);
34 Fattach(doorfd, argv[1]);
35 Write(contpipe[1], &c, 1); /* уведомление о готовности двери */
36 Start_time();
37 for (i = 0; i < nloop; i++)
38 reader(doorfd, totalnbytes);
39 printf("bandwidth: %.3f MB/sec\n",
40 totalnbytes / Stop_time() * nloop);
41 kill(childpid, SIGTERM);
42 unlink(argv[1]);
43 exit(0);
44 }