Работа с разделяемой памятью
Для работы с разделяемой памятью используются системные вызовы:
Прототипы перечисленных системных вызовов описаны в файлах: #include <sys/ipc.h>#include <sys/shm.h>После того, как сегмент разделяемой памяти подключен к виртуальной памяти процесса, этот процесс может обращаться к соответствующим элементам памяти с использованием обычных машинных команд чтения и записи. Системный вызов int shmid = shmget (key_t key, size_t size, int flag);на основании параметра size определяет желаемый размер сегмента в байтах. Если в таблице разделяемой памяти находится элемент, содержащий заданный ключ, и права доступа не противоречат текущим характеристикам обращающегося процесса, то значением системного вызова является идентификатор существующего сегмента. В противном случае создается новый сегмент с размером не меньше установленного в системе минимального размера сегмента разделяемой памяти и не больше установленного максимального размера. Создание сегмента не означает немедленного выделения под него основной памяти и это действие откладывается до выполнения первого системного вызова подключения сегмента к виртуальной памяти некоторого процесса. Флаги IPC_CREAT и IPC_EXCL аналогичны рассмотренным выше. Подключение сегмента к виртуальной памяти выполняется путем обращения к системному вызову shmat(): void *virtaddr = shmat(int shmid, void *daddr, int flags);Параметр shmid - это ранее полученный идентификатор сегмента, а daddr - желаемый процессом виртуальный адрес, который должен соответствовать началу сегмента в виртуальной памяти. Значением системного вызова является фактический виртуальный адрес начала сегмента. Если значением daddr является NULL, ядро выбирает наиболее удобный виртуальный адрес начала сегмента.
Флаги системного вызова shmat():
Для отключения сегмента от виртуальной памяти используется системный вызов shmdt(): int shmdt(*daddr);где daddr - это виртуальный адрес начала сегмента в виртуальной памяти, ранее полученный от системного вызова shmat(). Системный вызов shmctl() int shmctl (int shmid, int command, struct shmid_ds *shm_stat);по синтаксису и назначению полностью аналогичен msgctl().
|