XSI IPC
.pdf1 аргумент: key_t key
1.Результат вызова функции ftok()
2.Специальное значение IPC_PRIVATE, которое приводит к попытке создания новой разделяемой памяти с ключом, значение которого не совпадает ни с одним ключом уже существующих объектов IPC, и которое не может быть получено с помощью функции ftok() ни при каких комбинациях её параметров
2 аргумент: size_t size
Аргумент size задает размер создаваемого сегмента памяти.
Если сегмент памяти с заданным ключом уже существует и заданное значение size не совпадает с размером существующего сегмента, то констатируется возникновение ошибки.
3 аргумент: int shmflg
Имеет значение только при создании новой очереди и определяет права доступа к данной очереди различных пользователей, а так же необходимость создания новой очереди и правила поведения функции при этом.
IPC_CREAT — если РП для указанного ключа не существует, она должна быть создана;
IPC_EXCL — применяется совместно с флагом IPC_CREAT. При совместном их использовании и существовании РП с указанным ключом доступ к РП не производится и констатируется ошибочная ситуация, при этом переменная errno;
Подключение РП к процессу
#include <sys/types.h> #include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
Возвращает адрес сегмента памяти в адресном пространстве процесса в случае успеха, -1 в случае ошибки
Аргумент *shmaddr
Аргумент *shmaddr является указателем на область памяти к которой необходимо подключить новый сегмент. Заместо конкретного указателя на память может быть введено значение NULL, в этом случае память будет присоединена к первому свободному участку памяти в адресном пространстве процесса.
Аргумент shmflg
Аргумент shmflg может принимать множество различных значений, но в рамках интересующих нас в ключе обмена информации между процессами — нас будет интересовать лишь два значения
0 — осуществление чтения и записи в сегмент памяти
SHM_RDONLY — только чтение из сегмента памяти
Отсоединение РП от процесса
#include <sys/types.h> #include <sys/shm.h>
int shmdt(char *shmaddr);
Возвращает 0 в случае успеха, -1 в случае ошибки
Удаление РП
Нет счетчика ссылок! Удаление вручную. #include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
Пример:
shmctl(sd, IPC_RMID, NULL);
Удаление вручную
Команды интерпретатора
ipcs -a просмотр всех средств IPC ipcrm - удаление IPC из системы
Пример
Использование разделяемой памяти между процессами существующими в разное время в системе
shm-idle.c