Прежде чем воспользоваться разделением памяти, нужно создать
разделяемый сегмент с уникальным идентификатором и ассоциированную с ним
структуру данных. Уникальный идентификатор называется идентификатором
разделяемого сегмента памяти (shmid); он используется для обращений к
ассоциированной структуре данных, которая определяется следующим образом:
struct shmid_ds {
struct ipc_perm shm_perm; /* Структура прав на
выполнение операций */
int shm_segsz; /* Размер сегмента */
struct region *shm_reg; /* Указатель на структуру
области памяти */
char pad [4]; /* Информация для
подкачки */
ushort shm_lpid; /* Ид-р процесса, вып.
последнюю операцию */
ushort shm_cpid; /* Ид-р процесса,
создавшего сегмент */
ushort shm_nattch; /* Число присоединивших
сегмент */
ushort shm_cnattch; /* Число удерживающих
сегмент в памяти */
time_t shm_atime; /* Время последнего
присоединения */
time_t shm_dtime; /* Время последнего
отсоединения */
time_t shm_ctime; /* Время последнего
изменения */
};
(см. включаемый файл <sys/shm.h>
).
Следующая таблица содержит информацию о возможных состояниях разделяемых сегментов памяти:
Бит удержания | Бит подкачки | Бит размещения | Состояние |
0 | 0 | 0 | Неразмещенный сегмент |
0 | 0 | 1 | В памяти |
0 | 1 | 0 | Не используется |
0 | 1 | 1 | На диске |
1 | 0 | 0 | Не используется |
1 | 0 | 1 | Удержан в памяти |
1 | 1 | 0 | Не используется |
1 | 1 | 1 | Не используется |
Состояния, упомянутые в таблице, таковы:
После того, как создан уникальный идентификатор разделяемого сегмента памяти и ассоциированная с ним структура данных, можно использовать системные вызовы семейства shmop (операции над разделяемыми сегментами) и shmctl (управление разделяемыми сегментами).