Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:

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));

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 }

  • Читать дальше
  • 1
  • ...
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: