Чтение онлайн

на главную - закладки

Жанры

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

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

Шрифт:

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 int c, fd, flags;

6 char *ptr;

7 off_t length;

8 flags = O_RDWR | O_CREAT;

9 while ((c = Getopt(argc, argv, "e")) != –1) {

10 switch (c) {

11 case 'e':

12 flags |= O_EXCL;

13 break;

14 }

15 }

16 if (optind != argc – 2)

17 err_quit("usage: shmcreate [ –e ] <name> <length>");

18 length = atoi(argv[optind + 1]);

19 fd = Shm_open(argv[optind], flags, FILE_MODE);

20 Ftruncate(fd, length);

21 ptr = Mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

22 exit(0);

23 }

19-22 Вызов shm_open создает объект разделяемой памяти. Если указан параметр –е, будет возвращена ошибка в том случае, если такой объект уже существует. Вызов ftruncate устанавливает длину (размер объекта), a mmap отображает его содержимое в адресное пространство процесса. Затем программа завершает работу. Поскольку разделяемая память Posix обладает живучестью ядра, объект разделяемой памяти при этом не исчезает.

Программа shmunlink

В листинге 13.2 приведен текст тривиальной программы, удаляющей имя объекта разделяемой памяти из системы.

Листинг 13.2. Удаление имени объекта разделяемой памяти Posix

//pxshm/shmunlink.c

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5 if (argc != 2)

6 err_quit("usage: shmunlink <name>");

7 Shm_unlink(argv[1]);

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, после чего он отображается в память с доступом только на чтение, а дескриптор закрывается.

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

Изгой Проклятого Клана. Том 3

Пламенев Владимир
3. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 3

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец

Телохранитель Генсека. Том 4

Алмазный Петр
4. Медведев
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Телохранитель Генсека. Том 4

Шиари выбирает первой

Чернованова Валерия Михайловна
1. Шиари
Фантастика:
юмористическая фантастика
5.25
рейтинг книги
Шиари выбирает первой

Эволюционер из трущоб

Панарин Антон
1. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб

Газлайтер. Том 28

Володин Григорий Григорьевич
28. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 28

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Адвокат

Константинов Андрей Дмитриевич
1. Бандитский Петербург
Детективы:
боевики
8.00
рейтинг книги
Адвокат

Встреча

Видум Инди
7. Петя и Валерон
Фантастика:
рпг
аниме
попаданцы
5.00
рейтинг книги
Встреча

Запрети любить

Джейн Анна
1. Навсегда в моем сердце
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Запрети любить

Черный Маг Императора 26

Герда Александр
26. Черный маг императора
Фантастика:
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 26

Практик

Листратов Валерий
5. Ушедший Род
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Практик

Газлайтер. Том 3

Володин Григорий
3. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 3

Тринадцатый VIII

NikL
8. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VIII