Создание общего сегмента памяти с помощью функции shmat
В этом разделе приведены инструкции по созданию общего сегмента памяти с помощью функции shmat.
Предварительные требования
Нет.
Процедура
- Создайте ключ для идентификации общего
сегмента. Для этого вызовите функцию
ftok. Например, для
создания ключа mykey с идентификатором проекта R,
хранящимся в переменной proj (тип char) и именем файла
null_file, воспользуйтесь следующим оператором:
mykey = ftok( null_file, proj ); - Выполните одно из следующих действий:
- Создайте общий сегмент памяти с помощью функции shmget.
Например, для создания сегмента размером 4096 и
присвоения значения shmid целочисленной переменной mem_id,
используйте следующее выражение:
mem_id = shmget(mykey, 4096, IPC_CREAT | o666 ); - Получите указатель на ранее созданный общий сегмент с помощью функции
shmget.
Например, для того чтобы получить ссылку на сегмент, ранее связанный с ключом
mykey и присвоить значение shmid целочисленной переменной
mem_id, укажите в программе оператор:
mem_id = shmget( mykey, 4096, IPC_ACCESS );
- Создайте общий сегмент памяти с помощью функции shmget.
Например, для создания сегмента размером 4096 и
присвоения значения shmid целочисленной переменной mem_id,
используйте следующее выражение:
- Предоставьте общий сегмент процессу с помощью функции
shmat.
Например, для подключения созданного сегмента можно
воспользоваться оператором
В этом примере переменная ptr представляет собой указатель на структуру, определяющую поля общего сегмента. Такая структура-шаблон применяется для чтения и записи данных в общий сегмент. Шаблон должен совпадать для всех процессов, работающих с общим сегментом.ptr = shmat( mem_id ); - Выполните необходимые операции с данными сегмента, пользуясь шаблонной структурой.
- Отключите общий сегмент от процесса с помощью функции
shmdt:
shmdt( ptr ); - Если общий сегмент больше не нужен, удалите его с помощью функции
shmctl:
shmctl( mem_id, IPC_RMID, ptr );Примечание: с помощью команды ipcs можно получить информацию о сегменте, а с помощью команды ipcrm удалить сегмент.