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

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

Шрифт:

8 exit(0);

9 }

Программа shmwrite

В листинге 13.3 приведен текст программы shmwrite, записывающей последовательность 0, 1, 2 254, 244, 0, 1 и т. д. в объект разделяемой памяти.

Листинг 13.3. Заполнение разделяемой памяти

//pxshm/shmwrite.с

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 int i, fd;

6 struct stat stat;

7 unsigned char *ptr;

8 if (argc != 2)

9 err_quit("usage: shmwrite <name>");

10 /* open, определяем размер, отображаем в память */

11 fd = Shm_open(argv[1], O_RDWR, FILE_MODE);

12 Fstat(fd, &stat);

13 ptr = Mmap(NULL, stat.st_size, PROT_READ | PROT_WRITE,

14 MAP_SHARED, fd, 0);

15 Close(fd);

16 /* присваиваем: ptr[0] = 0, ptr[1] = 1 и т. д. */

17 for (i = 0; i < stat.st_size; i++)

18 *ptr++ = i % 256;

19 exit(0);

20 }

10-15 Объект разделяемой памяти открывается вызовом shm_open. Его размер мы узнаем с помощью fstat. Затем файл отображается в память вызовом mmap, после чего его дескриптор может быть закрыт.

16-18 Последовательность записывается в разделяемую память.

Программа shmread

Программа shmread (листинг 13.4) проверяет значения, помещенные в разделяемую память программой shmwrite.

Листинг 13.4. Проверка значений в разделяемой памяти

//pxshm/shmread.c

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 int i, fd;

6 struct stat stat;

7 unsigned char c, *ptr;

8 if (argc != 2)

9 err_quit("usage: shmread <name>");

10 /* вызываем open, узнаем размер, отображаем в память*/

11 fd = Shm_open(argv[1], O_RDONLY, FILE_MODE);

12 Fstat(fd, &stat);

13 ptr = Mmap(NULL, stat.st_size, PROT_READ,

14 MAP_SHARED, fd, 0);

15 Close(fd);

16 /* проверяем равенства ptr[0] = 0, ptr[1] = 1 и т. д. */

17 for (i = 0; i < stat.st_size; i++)

18 if ((c = *ptr++) != (i % 256))

19 err_ret("ptr[%d] = %d", i, c);

20 exit(0);

21 }

10-15 Объект разделяемой памяти открывается только для чтения, его размер получается вызовом fstat, после чего он отображается в память с доступом только на чтение, а дескриптор закрывается.

16-19 Проверяются значения, помещенные в разделяемую память вызовом shmwrite.

Примеры

Создадим объект разделяемой памяти с именем /tmp/myshm объемом 123 456 байт в системе Digital Unix 4.0B:

alpha % shmcreate /tmp/myshm 123456

alpha % ls –l /tmp/myshm

– rw-r--r-- 1 rstevens system 123456 Dec 10 14:33 /tmp/myshm

alpha % od –c /tmp/myshm

0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0

*

0361100

Мы видим, что файл с указываемым при создании объекта разделяемой памяти именем появляется в файловой системе. Используя программу od, мы можем выяснить, что после создания файл целиком заполнен нулями (восьмеричное число 0361100 — сдвиг, соответствующий байту, следующему за последним байтом файла, — эквивалентно десятичному 123 456).

Запустим программу shmwrite и убедимся в правильности записываемых значений с помощью программы od:

  • Читать дальше
  • 1
  • ...
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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