Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Системные вызовы для работы с общей памятью posix

Ниже приводится краткое описание системных вызовов имеющих непосредственное отношение к общей памяти:

shm_open - открывает объект разделяемой памяти

#include <sys/mman.h>

int shm_open (

const char *name, /* имя POSIX IPC*/

int flags, /* флаги */

mode_t perms /* права доступа */

);

/* Возвращает файловый дескриптор или -1 в случае ошибки (код ошибки - в errno) */

shm_unlink - удаляет объект разделяемой памяти

#include <sys/mman.h>

int shm_ unlink (

const char *name /* имя POSIX IPC*/

);

/* Возвращает 0 в случае успеха или -1 в случае ошибки (код ошибки - в errno) */

Не следует использовать флаг O_WRONLY. В случае создания нового объекта в третьем аргументе передаются права доступа к объекту. Как и другие объекты взаимодействия процессов, сегмент общей памяти POSIX остается в системе после его закрытия, по крайней мере, до перезагрузки системы. По окончании работы с дескриптором он может быть закрыт обычным системным вызовом close, как и любой другой файловый дескриптор. После создания сегмента общей памяти производится установка его размера вызовом ftruncate, поскольку изначально он имеет нулевую длину:

ftruncate - изменяет размер файла, заданного дескриптором

#include <unistd.h>

int ftruncate (

int fd, /* дескриптор файла*/

off_t length /* новый размер файла*/

);

/* Возвращает 0 в случае успеха или -1 в случае ошибки (код ошибки - в errno) */

Для отображения сегмента в адресное пространство процесса используется системный вызов mmap:

mmap - отображает страницы памяти в адресное пространство процесса

#include <sys/mman.h>

void *mmap (

void *addr, /* желаемый адрес отображения или NULL*/

size_t len, /* размер сегмента*/

int prot, /* защита сегмента*/

int flags, /* флаги */

int fd, /* дескриптор файла*/

off_t off /* смещение в файле или в объекте разделяемой памяти*/

);

/* Возвращает указатель на сегмент или MAP_FAILED в случае ошибки (код ошибки - в errno) */

С помощью аргумента addr можно указать начальный адрес, в который следует отобразить сегмент общей памяти, при этом аргумент flags должен содержать флаг MAP_FIXED. В противном случае этот аргумент должен иметь значение NULL. Аргумент prot может содержать либо значение PROT_NONE, что означает полную недоступность объекта, либо комбинацию из следующих флагов, объединенных по ИЛИ:

PROT_READ - объект доступен для чтения;

PROT_WRITEобъект доступен для записи;

PROT_EXEC - объект доступен для исполнения.

Чтобы подготовить сегмент общей памяти для чтения-записи, нужно выполнить следующую последовательность:

ftruncate(fd, len);

mem = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

ec_cmp(mem, MAP_FAILED)

Главное преимущество общей памяти POSIX заключается в наличии системного вызова mmap, который может отобразить в адресное пространство процесса любой обычный файл, а не только объект общей памяти. Имеется возможность отобразить в память не весь объект, а только часть его. Ключевой недостаток общей памяти POSIX – эта реализация доступна не на всех системах. Например, ее нет в Linux, FreeBSD и Darwin.