#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