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

UptoLike

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

258
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 желаемый процессом виртуальный адрес, который должен соот-
ветствовать началу сегмента в виртуальной памяти. Значением систем-
ного вызова является фактический виртуальный адрес начала сегмента.
Если значением daddr является NULL, ядро выбирает наиболее удобный