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

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

Шрифт:

40 n = Read(pipe2[0], &nread, sizeof(ssize_t)); /* *INDENT-OFF* */

41 if (n != sizeof(ssize_t))

42 err_quit("parent: read on pipe returned %d", n); /* *INDENT-ON* */

43 printf("read %d bytes, type = %ld\n", nread, buff->mtype);

44 Write(pipe1[1], &c, 1);

45 } else

47 }

46 err_quit("pipe2[0] not ready");

48 Kill(childpid, SIGTERM);

49 exit(0);

50 }

Глава 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\n", (long) pagesize);

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

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

22 ptr[i] = 1;

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

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

25 }

26 printf("ptr[%d] =%d\n", 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\n", i);

14 Ftruncate(fd, i);

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

16 }

17 exit(0);

18 }

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

Глава 14

1. Нужно изменить только одну строку:

13с13

< id = Shmget(Ftok(argv[1], 0), 0, SVSHM_MORE);

…

> id = atol(argv[1]);

Глава 15

1. Аргументы будут иметь размер data_size + (desc_numxsizeof(door_desc_t)) байт.

2. Вызывать fstat не нужно. Если дескриптор не указывает на дверь, вызов door_infо возвращает ошибку EBADF:

  • Читать дальше
  • 1
  • ...
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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