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

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

Шрифт:

19 Вызов shmget создает сегмент разделяемой памяти указанного размера. Полное имя, передаваемое в качестве аргумента командной строки, преобразуется в ключ IPC System V вызовом ftok. Если указан параметр –е, наличие существующего сегмента с тем же именем приведет к возвращению ошибки. Если мы знаем, что сегмент уже существует, в командной строке должна быть указана нулевая длина.

20 Вызов shmat подключает сегмент к адресному пространству процесса. После этого программа завершает работу. Разделяемая память System V обладает поменьшей мере живучестью ядра, поэтому сегмент разделяемой памяти при этом не удаляется.

Программа shmrmid

В листинге 14.2 приведен текст тривиальной программы shmrmid, которая вызывает shmctl с командой IPC_RMID для удаления сегмента разделяемой памяти из системы.

Листинг 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 }

Программа shmwrite

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

Программа shmread

Программа 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.

Примеры

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

  • Читать дальше
  • 1
  • ...
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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