Глава 13

Глава 13

1. В листинге Г.8 приведен текст измененной версии листинга 12.6, а в листинге Г.9 — текст новой версии листинга 12.7. Обратите внимание, что в первой пpoгрaммe мы устанавливаем размер объекта вызовом ftruncate; lseek и write использовать для этого нельзя.

Листинг Г.8. Отображение с точным указанием размера файла

//pxshra/test1.c

1  #include "unpipc.h"

2  int

3  main(int argc, char **argv)

4  {

5   int fd, i;

6   char *ptr;

7   size_t shmsize, mmapsize, pagesize;

8   if (argc != 4)

9    err_quit("usage: test1 <name> <shmsize> <mmapsize>");

10  shmsize = atoi(argv[2]);

11  mmapsize = atoi(argv[3]);

12  /* открываем shm: создание или урезание; установка размера */

13  fd = Shm_open(Px_ipc_name(argv[1]), O_RDWR | O_CREAT | O_TRUNC,

14   FILE_MODE);

15  Ftruncate(fd, shmsize); /* $$.bp$S */

16  ptr = Mmap(NULL, mmapsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

17  Close(fd);

18  pagesize = Sysconf(_SC_PAGESIZE);

19  printf("PAGESIZE = %ld ", (long) pagesize);

20  for (i = 0; i < max(shmsize, mmapsize); i += pagesize) {

21   printf("ptr[%d] = %d ", i, ptr[i]);

22   ptr[i] = 1;

23   printf("ptr[%d] = %d ", i + pagesize – 1, ptr[i + pagesize – 1]);

24   ptr[i + pagesize – 1] = 1;

25  }

26  printf("ptr[%d] =%d ", i, ptr[i]);

27  exit(0);

28 }

Листинг Г.9. Отображение в память с возможностью роста файла

//pxshm/test2.c

1  #include "unpipc.h"

2  #define FILE "test.data"

3  #define SIZE 32768

4  int

5  main(int argc, char **argv)

6  {

7   int fd, i;

8   char *ptr;

9   /* создаем или урезаем, отображаем */

10  fd = Shm_open(Px_ipc_name(FILE), O_RDWR | O_CREAT | O_TRUNC, FILE_MODE);

11  ptr = Mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

12  for (i = 4096; i <= SIZE; i += 4096) {

13   printf("setting shm size to %d ", i);

14   Ftruncate(fd, i);

15   printf("ptr[%d] = %d ", i-1, ptr[i-1]);

16  }

17  exit(0);

18 }

2. Одна из возможных проблем при использовании *ptr++ заключается в том, что указатель, возвращенный mmap, изменяется, что может помешать впоследствии вызвать munmap. Если этот указатель еще понадобится, лучше его сохранить или вовсе не изменять.

Данный текст является ознакомительным фрагментом.