Листинг 14.2. Удаление сегмента разделяемой памяти system V из системы

//svshm/shmrmid.c

1  #include "unpipc.h"

2  int

3  main(int argc, char **argv)

4  {

5   int id;

6   if (argc != 2)

7    err_quit("usage: shmrmid pathname");

8   id = Shmget(Ftok(argv[1], 0), 0, SVSHM_MODE);

9   Shmctl(id, IPC_RMID, NULL);

10  exit(0);

11 }

<p>Программа shmwrite</p>

В листинге 14.3 приведен текст программы shmwrite, которая заполняет сегмент разделяемой памяти последовательностью значений 0, 1, 2, …, 254, 255, 0, 1 и т. д.

Листинг 14.3. Заполнение сегмента разделяемой памяти последовательностью чисел

//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 pathname");

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 В разделяемую память записывается последовательность значений.

<p>Программа shmread</p>

Программа shmread, текст которой приведен в листинге 14.4, проверяет последовательность значений, записанную в разделяемую память программой shmwrite.

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

//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 pathname");

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.

<p>Примеры</p>

Создадим сегмент разделяемой памяти длиной 1234 байта в системе Solaris 2.6. Для идентификации сегмента используем полное имя нашего исполняемого файла shmget. Это имя будет передано функции ftok. Имя исполняемого файла сервера часто используется в качестве уникального идентификатора для данного приложения:

solaris % shmget shmget 1234

solaris % ipcs –bmo

IPC status from running system as of Thu Jan 8 13:17:06 1998

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 running system as of Thu Jan 8 13:17:06 1998

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже