Разделяемая память
shmget
создает новый сегмент разделяемой памяти или находит существующий
сегмент с тем же ключом
shmat
подключает сегмент с указанным дескриптором к виртуальной памяти
обращающегося процесса
shmdt
отключает от виртуальной памяти ранее подключенный к ней сегмент
с указанным виртуальным адресом начала
shmctl
служит для управления параметрами, связанными с существующим сегментом
После подключения сегмента разделяемой памяти к виртуальной
памяти процесса, он может обращаться к соответствующим элементам
памяти с использованием обычных машинных команд чтения и записи
shmid = shmget(key, size,
flag);
- size
определяет желаемый размер сегмента в байтах
- если в таблице разделяемой памяти находится элемент, содержащий
заданный ключ, и права доступа не противоречат текущим характеристикам
процесса, то значением системного вызова является дескриптор существующего
сегмента
- реальный размер сегмента можно узнать с помощью системного
вызова shmctl
- иначе создается новый сегмент с размером не меньше установленного
в системе минимального размера сегмента разделяемой памяти и не
больше установленного максимального размера
- создание сегмента не означает немедленного выделения под него
основной памяти
- откладывается до выполнения первого системного вызова подключения
сегмента к виртуальной памяти некоторого процесса
- при выполнении последнего системного вызова отключения сегмента
от виртуальной памяти соответствующая основная память освобождается
virtaddr = shmat(id, addr,
flags);
- id
- это ранее полученный дескриптор сегмента
- addr - желаемый
процессом виртуальный адрес, который должен соответствовать началу
сегмента в виртуальной памяти
- virtaddr - реальный
виртуальный адрес начала сегмента
- не обязательно совпадает со значением прямого параметра addr
- если addr ==
0, ядро выбирает наиболее удобный виртуальный адрес начала сегмента
shmdt(addr);
- addr
- виртуальный адрес начала сегмента в виртуальной памяти, ранее
полученный от системного вызова shmat
shmctl(id, cmd, shsstatbuf);
- cmd
идентифицирует требуемое конкретное действие
- важна функция уничтожения сегмента разделяемой памяти