Читать «UNIX: взаимодействие процессов» онлайн - страница 309
Уильям Ричард Стивенс
3 void reader(int, mqd_t, int);
4 void writer(int, mqd_t);
5 void *buf;
6 int totalnbytes, xfersize;
7 int
8 main(int argc, char **argv)
9 {
10 int i, nloop, contpipe[2];
11 mqd_t mq;
12 pid_t childpid;
13 struct mq_attr attr;
14 if (argc != 4)
15 err_quit("usage: bw_pxmsg <#loops> <#mbytes> <#bytes/write>");
16 nloop = atoi(argv[1]);
17 totalnbytes = atoi(argv[2]) * 1024 * 1024;
18 xfersize = atoi(argv[3]);
19 buf = Valloc(xfersize);
20 Touch(buf, xfersize);
21 Pipe(contpipe);
22 mq_unlink(Px_ipc_name(NAME)); /* error OK */
23 attr.mq_maxmsg = 4;
24 attr.mq_msgsize = xfersize;
25 mq = Mq_open(Px_ipc_name(NAME), O_RDWR | O_CREAT, FILE_MODE, &attr);
26 if ((childpid = Fork()) == 0) {
27 writer(contpipe[0], mq); /* child */
28 exit(0);
29 }
30 /* 4parent */
31 Start_time();
32 for (i = 0; i < nloop; i++)
33 reader(contpipe[1], mq, totalnbytes);
34 printf("bandwidth: %.3f MB/sec\n",
35 totalnbytes / Stop_time() * nloop);
36 kill(childpid, SIGTERM);
37 Mq_close(mq);
38 Mq_unlink(Px_ipc_name(NAME));
39 exit(0);
40 }
Листинг А.6. Функции reader и writer
//bench/bw_pxmsg.c
41 void
42 writer(int contfd, mqd_t mqsend)
43 {
44 int ntowrite;
45 for(;;) {
46 Read(contfd, &ntowrite, sizeof(ntowrite));
47 while (ntowrite > 0) {
48 Mq_send(mqsend, buf, xfersize, 0);
49 ntowrite –= xfersize;
50 }
51 }
52 }
53 void
54 reader(int contfd, mqd_t mqrecv, int nbytes)
55 {
56 ssize_t n;
57 Write(contfd, &nbytes, sizeof(nbytes));
58 while ((nbytes > 0) &&
59 ((n = Mq_receive(mqrecv, buf, xfersize, NULL)) > 0)) {
60 nbytes –= n;
61 }
62 }
Программа измерения полосы пропускания очереди 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/sec\n",
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));