UNIX: взаимодействие процессов
Шрифт:
10-12
Примеры
Создадим сегмент разделяемой памяти длиной 1234 байта в системе Solaris 2.6. Для идентификации сегмента используем полное имя нашего исполняемого файла shmget. Это имя будет передано функции ftok. Имя исполняемого файла сервера часто используется в качестве уникального идентификатора для данного приложения:
Программу ipcs мы запускаем для того, чтобы убедиться, что сегмент разделяемой памяти действительно был создан и не был удален по завершении программы shmcreate. Количество подключений (хранящееся в поле shm_nattch структуры shmid_ds) равно нулю, как мы и предполагали.
Теперь запустим пpoгрaммy shmwrite, чтобы заполнить содержимое разделяемой памяти последовательностью значений. Затем проверим содержимое сегмента разделяемой памяти программой shmread и удалим этот сегмент:
Мы используем программу ipcs, чтобы убедиться, что сегмент разделяемой памяти действительно был удален.
ПРИМЕЧАНИЕ
При использовании имени исполняемого файла сервера в качестве аргумента ftok для идентификации какого-либо вида IPC System V обычно передается полное имя этого файла (например, /usr/bin/myserverd), а не часть имени, как сделано у нас (shmget). У нас не возникло проблем в этом примере, потому что все программы запускались из того же каталога, в котором был расположен исполняемый файл сервера. Вы помните, что функция ftok использует номер i-node файла для формирования ключа IPC и ей безразлично, определяется файл своим полным именем или его частью (относительным именем).
14.7. Ограничения, накладываемые на разделяемую память
На разделяемую память System V накладываются определенные ограничения точно так же, как и на семафоры и очереди сообщений System V (раздел 3.8). В табл. 14.1 приведены значения этих ограничений для разных реализаций. В первом столбце приведены традиционные
для System V имена переменных ядра, в которых хранятся эти ограничения.Таблица 14.1. Типичные значения ограничений, накладываемых на разделяемую память System V
Имя | Описание | DUnix 4.0B | Solaris 2.6 |
---|---|---|---|
shmmax | Максимальный размер сегмента в байтах | 4194304 | 1048576 |
shmmnb | Минимальный размер сегмента разделяемой памяти в байтах | 1 | 1 |
shmmni | Максимальное количество идентификаторов разделяемой памяти в системе | 128 | 100 |
shmseg | Максимальное количество сегментов, подключенных к процессу | 32 | 6 |
Пример
Программа в листинге 14.5 определяет значения четырех ограничений, приведенных в табл. 14.1.