Второй параметр size
задает требуемый объем памяти в байтах.
Третий параметр shmflg
содержит девять флагов прав доступа, которые используются так же, как флаги режима создающихся файлов. Для создания нового сегмента совместно используемой памяти специальный бит, описываемый IPC_CREAT
, должен с помощью поразрядной операции OR
быть объединен с правами доступа. Не считается ошибкой задание флага IPC_CREAT
и передача ключа существующего сегмента совместно используемой памяти. Флаг IPC_CREAT
, если в нем нет нужды, беззвучно игнорируется.
Флаги прав доступа к совместно используемой памяти очень полезны, поскольку позволяют процессу создать совместно используемую память, в которую могут писать процессы, принадлежащие создателю этой разделяемой памяти, а процессы, созданные другими пользователями, могут только читать этот сегмент памяти. Вы можете использовать этот механизм для обеспечения эффективного доступа к данным только для чтения, поместив их в совместно используемую память без какого- либо риска их повреждения другими пользователями.
Если совместно используемая память создана успешно, shmget
вернет неотрицательное целое, идентификатор совместно используемой памяти. В случае аварийного завершения функция вернет -1.
Когда вы впервые создаете сегмент совместно используемой памяти, он недоступен ни одному процессу. Для того чтобы обеспечить доступ к совместно используемой памяти, нужно присоединить ее к адресному пространству процесса. Делается это с помощью функции shmat
:
void *shmat(int shm_id, const void *shm_addr, int shmflg);
Первый параметр shm_id
— идентификатор совместно используемой области памяти, возвращаемый функцией shmget
.
Второй параметр shm_addr
— адрес, по которому совместно используемая память присоединяется к текущему процессу. Почти всегда его следует задавать пустым указателем, что позволяет системе выбрать адрес для доступа к совместно используемой памяти.
Третий параметр shmflg
— набор поразрядных флагов. Два возможных значения: SHM_RND
, в сочетании с shm_addr
управляющее адресом, по которому присоединяется к процессу совместно используемая память, и SHM_RDONLY
, которое делает присоединенную память доступной только для чтения. Очень редко возникает необходимость управлять адресом присоединения совместно используемой памяти. Как правило, следует позволить системе выбрать для вас адрес, поскольку в противном случае приложение станет в значительной степени аппаратно-зависимым.
Если вызов shmat
завершился успешно, он вернет указатель на первый байт совместно используемой памяти. В случае аварийного завершения возвращается -1.
Наличие доступа для чтения совместно используемой памяти и записи в нее зависит от владельца (создателя сегмента совместно используемой памяти), прав доступа и владельца текущего процесса. Права доступа к совместно используемой памяти подобны правам доступа к файлам.
Исключение из этого правила возникает, если выражение shmflg & SHM_RDONLY
равно true
. В этом случае в совместно используемую память нельзя писать, даже если права доступа предоставляют такую возможность.
Функция shmdt
отсоединяет совместно используемую память от текущего процесса. Она принимает указатель на адрес, возвращенный функцией shmat
. В случае успеха функция вернет 0, в случае ошибки - -1. Имейте в виду, что отсоединение совместно используемой памяти не уничтожает ее, а только делает эту память недоступной для текущего процесса.
Функции управления совместно используемой памятью (к счастью) гораздо проще аналогичных, но более сложных функций для семафоров:
int shmctl(int shm_id, int command, struct shmid_ds *buf);
У структуры типа shmid_ds
есть, как минимум, следующие элементы:
struct shmid_ds {
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
}
Первый параметр shm_id
— идентификатор, возвращаемый функцией shmget
.
Второй параметр command
содержит предпринимаемое действие. Он может принимать три значения, перечисленные в табл. 14.2.
Таблица 14.2
Значение |
Описание |
IPC_STAT |
Задаёт данные в структуре shmid_ds , отображающие значения, связанные с совместно используемой памятью |
IPC_SET |
Устанавливает значения, связанные с совместно используемой памятью в соответствии с данными из структуры типа shmid_ds , если у процесса есть право на это действие |
IPC_RMID |
Удаляет сегмент совместно используемой памяти |
Третий параметр buf
— указатель на структуру, содержащую режимы и права доступа для совместно используемой памяти.
Читать дальше