11 }
Программа shmwrite
В листинге 14.3 приведен текст программы shmwrite, которая заполняет сегмент разделяемой памяти последовательностью значений 0, 1, 2, …, 254, 255, 0, 1 и т. д.
//svshm/shmwrite.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int i, id;
6 struct shmid_ds buff;
7 unsigned char *ptr;
8 if (argc != 2)
9 err_quit("usage: shmwrite
10 id = Shmget(Ftok(argv[1], 0), 0, SVSHM_MODE);
11 ptr = Shmat(id, NULL, 0);
12 Shmctl(id, IPC_STAT, &buff);
13 /* присваиваем: ptr[0] = 0, ptr[1] = 1 и т. д. */
14 for (i = 0; i < buff.shm_segsz; i++)
15 *ptr++ = i % 256;
16 exit(0);
17 }
10-12 Сегмент разделяемой памяти открывается вызовом shmget и подключается вызовом shmat. Его размер может быть получен вызовом shmctl с командой IPC_STAT.
13-15 В разделяемую память записывается последовательность значений.
Программа shmread
Программа shmread, текст которой приведен в листинге 14.4, проверяет последовательность значений, записанную в разделяемую память программой shmwrite.
//svshm/shmread.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int i, id;
6 struct shmid_ds buff;
7 unsigned char c, *ptr;
8 if (argc != 2)
9 err_quit("usage: shmread
10 id = Shmget(Ftok(argv[1], 0), 0, SVSHM_MODE);
11 ptr = Shmat(id, NULL, 0);
12 Shmctl(id, IPC_STAT, &buff);
13 /* проверка значений ptr[0] = 0, ptr[1] = 1 и т. д. */
14 for (i = 0; i < buff.shm_segsz; i++)
15 if ((c = *ptr++) != (i % 256))
16 err_ret("ptr[%d] = %d", i.e);
17 exit(0);
18 }
10-12 Открываем и подключаем сегмент разделяемой памяти. Его размер может быть получен вызовом shmctl с командой IPC_STAT. 13-16 Проверяется последовательность, записанная программой shmwrite.
Примеры
Создадим сегмент разделяемой памяти длиной 1234 байта в системе Solaris 2.6. Для идентификации сегмента используем полное имя нашего исполняемого файла shmget. Это имя будет передано функции ftok. Имя исполняемого файла сервера часто используется в качестве уникального идентификатора для данного приложения:
solaris % shmget shmget 1234
solaris % ipcs –bmo
IPC status from
T ID KEY MODE OWNER GROUP NATTCH SEGSZ
Shared Memory:
m 1 0x0000f12a –rw-r--r-- rstevens other1 0 1234
Программу ipcs мы запускаем для того, чтобы убедиться, что сегмент разделяемой памяти действительно был создан и не был удален по завершении программы shmcreate. Количество подключений (хранящееся в поле shm_nattch структуры shmid_ds) равно нулю, как мы и предполагали.
Теперь запустим пpoгрaммy shmwrite, чтобы заполнить содержимое разделяемой памяти последовательностью значений. Затем проверим содержимое сегмента разделяемой памяти программой shmread и удалим этот сегмент:
solaris % shmwrite shmget
solaris % shmread shmget
solaris % shmrmid shmget
solaris % ipes –bmo
IPC status from
T ID KEY MODE OWNER GROUP NATTCH SEGSZ
Shared Memory:
Мы используем программу ipcs, чтобы убедиться, что сегмент разделяемой памяти действительно был удален.