Описание

#include <sys/shm.h>

void *shmat(int shmid, const void *daddr, int shmflags);

Вызов shmat связывает участок памяти, обозначенный идентификатором shmid (который был получен в результате вызова shmget) с некоторым допустимым адресом логического адресного пространства вызывающего процесса. Этот адрес является значением, возвращаемым вызовом shmat (в языке C такие адреса дан­ных обычно представляются типом void *).

Параметр daddr позволяет программисту до некоторой степени управлять вы­бором этого адреса. Если этот параметр равен NULL, то участок подключается к первому доступному адресу, выбранному системой. Это наиболее простой слу­чай использования вызова shmat. Если параметр daddr не равен NULL, то участок будет подключен к содержащемуся в нем адресу или адресу в ближайшей окрест­ности в зависимости от флагов, заданных в аргументе shmflags. Этот вариант сложнее, так как при этом необходимо знать расположение программы в памяти.

Аргумент shmflag может содержать два флага, SHM_RDONLY и SHM_RND, опре­деленные в заголовочном файле <sys/shm.h>. При задании флага SHM_RDONLY участок памяти подключается только для чтения. Флаг SHM_RMD определяет, если это возможно, способ обработки в вызове shmat ненулевого значения daddr.

В случае ошибки вызов shmat вернет значение:

(void *)-1

Вызов shmdt противоположен вызову shmat и отключает участок разделяемой памяти от логического адресного пространства процесса (это означает, что про­цесс больше не может использовать его). Он вызывается очень просто:

retval = shmdt(memptr);

Возвращаемое значение retval является целым числом и равно 0 в случае ус­пеха и -1 - в случае ошибки.

Системный вызов shmctl


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: