на главную | войти | регистрация | DMCA | контакты | справка | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


моя полка | жанры | рекомендуем | рейтинг книг | рейтинг авторов | впечатления | новое | форум | сборники | читалки | авторам | добавить




Листинг А.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 <#loops> <#mbytes> <#bytes/write>");

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 }


Программа измерения полосы пропускания дверей | UNIX: взаимодействие процессов | Листинг A.10. Функции writer, server, reader для интерфейса дверей