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