Книга: UNIX: взаимодействие процессов

Глава 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 = %ldn", (long) pagesize);
20  for (i = 0; i < max(shmsize, mmapsize); i += pagesize) {
21   printf("ptr[%d] = %dn", i, ptr[i]);
22   ptr[i] = 1;
23   printf("ptr[%d] = %dn", i + pagesize – 1, ptr[i + pagesize – 1]);
24   ptr[i + pagesize – 1] = 1;
25  }
26  printf("ptr[%d] =%dn", 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 %dn", i);
14   Ftruncate(fd, i);
15   printf("ptr[%d] = %dn", i-1, ptr[i-1]);
16  }
17  exit(0);
18 }

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

Оглавление книги


Генерация: 0.058. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз