Операционные системы. Замятин А.В - 99 стр.

UptoLike

Составители: 

99
4.1.6. Работа с разделяемой памятью
Для работы с разделяемой памятью используются системные вызовы:
shmget создает новый сегмент разделяемой памяти или находит
существующий сегмент с тем же ключом;
shmat подключает сегмент с указанным описателем к виртуаль-
ной памяти обращающегося процесса;
shmdt отключает от виртуальной памяти ранее подключенный к
ней сегмент с указанным виртуальным адресом начала;
shmctl служит для управления разнообразными параметрами,
связанными с существующим сегментом.
Прототипы перечисленных системных вызовов описаны в файлах
#include <sys/ipc.h>
#include <sys/shm.h>
После того как сегмент разделяемой памяти подключен к вирту-
альной памяти процесса, этот процесс может обращаться к соответст-
вующим элементам памяти с использованием обычных машинных ко-
манд чтения и записи.
Системный вызов
int shmid = shmget (key_t key, size_t size, int flag)
на основании параметра size определяет желаемый размер сегмента в
байтах. Если в таблице разделяемой памяти находится элемент, содер-
жащий заданный ключ, и права доступа не противоречат текущим ха-
рактеристикам обращающегося процесса, то значением системного вы-
зова является идентификатор существующего сегмента, причем пара-
метр size должен быть в этом случае равен 0. В противном случае созда-
ется новый сегмент с размером не меньше установленного в системе
минимального размера сегмента разделяемой памяти и не больше уста-
новленного максимального размера. Живучесть объектов разделяемой
памяти определяется живучестью ядра. Создание сегмента не означает
немедленного выделения под него основной памяти, и это действие от-
кладывается до выполнения первого системного вызова подключения
сегмента к виртуальной памяти некоторого процесса. Флаги IPCCREAT
и IPCEXCL аналогичны рассмотренным выше.
Подключение сегмента к виртуальной памяти выполняется путем
обращения к системному вызову shmat:
void *virtaddr = shmat(int shmid, void *daddr, int flags).
Параметр shmid это ранее полученный идентификатор сегмента, a
daddr желаемый процессом виртуальный адрес, который должен соот-