Книга: Основы программирования в Linux
shmat
shmat
Когда вы впервые создаете сегмент совместно используемой памяти, он недоступен ни одному процессу. Для того чтобы обеспечить доступ к совместно используемой памяти, нужно присоединить ее к адресному пространству процесса. Делается это с помощью функции 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
. В этом случае в совместно используемую память нельзя писать, даже если права доступа предоставляют такую возможность.