Прежде чем воспользоваться разделением памяти, нужно создать разделяемый сегмент с уникальным идентификатором и ассоциированную с ним структуру данных. Уникальный идентификатор называется идентификатором разделяемого сегмента памяти (shmid); он используется для обращений к ассоциированной структуре данных, которая определяется следующим образом:
/*Структура прав на выполнение операций*/
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;
};
Информация о возможных состояниях разделяемых сегментов
памяти содержится в табл. 4:
Бит удержания | Бит подкачки | Бит размещения | Состояние |
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 (управление разделяемыми сегментами).