SHMOP(2)
НАЗВАНИЕ
shmop - операции над разделяемыми сегментами памяти
СИНТАКСИС
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/shm.h>
        
        char *shmat (shmid, shmaddr, shmflg)
        int shmid;
        char *shmaddr;
        int shmflg;
        
        int shmdt (shmaddr)
        char *shmaddr;
ОПИСАНИЕ
Присоединение сегмента
Системный  вызов shmat (см. СЮРПРИЗЫ) присоединяет разделяемый сегмент памяти, ассоциированный с  идентификатором  shmid,  к  сегменту данных вызывающего процесса.
Сегмент присоединяется по адресу,  заданному  одним  из
следующих способов:
- Если значение аргумента  shmaddr  равно  нулю,  то
сегмент присоединяется по адресу, выбранному  системой.
 - Если значение аргумента shmaddr не  равно  нулю  и
выражение (shmflg & SHM_RND) истинно,  то  сегмент
просоединяется по адресу, вычисляемому по  формуле
(shmaddr - (shmaddr mod SHMLBA)) [см. intro(2)].
 - Если значение аргумента shmaddr не  равно  нулю  и
выражение (shmflg &  SHM_RND)  ложно,  то  сегмент
присоединяется по адресу,  задаваемому  аргументом
shmaddr.
 
Отсоединение сегмента
Системный вызов shmdt отсоединяет  разделяемый  сегмент
памяти, расположенный по адресу  shmaddr,  от  сегмента
данных вызывающего процесса.
Если выражение (shmflg & SHM_RDONLY) истинно,  то  сегмент присоединяется для чтения {требуется право на чтение}, в противном  случае  сегмент  присоединяется  для
чтения и записи {требуется право на чтение и запись}.
Системный вызов shmat завершается неудачей и  разделяемый сегмент не присоединяется, если выполнено  хотя  бы
одно из следующих условий:
- [EINVAL]
 - Значение аргумента shmid не  является  корректным идентификатором  разделяемого  сегмента.
 - [EACCES]
 - У вызывающего процесса нет прав на выполнение операции [см. intro(2)].
 - [ENOMEM]
 - В сегменте данных нет места для присоединения разделяемого сегмента.
 - [EINVAL]
 - Значение аргумента shmaddr не равно нулю  и
значение  выражения  (shmaddr-(shmaddr  mod
SHMLBA)) не является корректным адресом.
 - [EINVAL]
 - Значение аргумента shmaddr не  равно  нулю,
выражение (shmflg & SHM_RND) ложно и значение аргумента shmaddr не является  корректным адресом.
 - [EMFILE]
 - Количество разделяемых сегментов, присоединенных к  вызывающему  процессу,  превышает
максимально допустимую величину.
 
Системный вызов shmdt завершается неудачей и  разделяемый сегмент не отсоединяется, если:
- [EINVAL]
 - Значение аргумента shmaddr не является  начальным адресом разделяемого сегмента.
 
СМ. ТАКЖЕ
exec(2),   exit(2),   fork(2),   intro(2),   shmctl(2),
shmget(2).
ДИАГНОСТИКА
При успешном завершении системного вызова shmat возвращается начальный адрес присоединенного сегмента.
При успешном завершении системного вызова shmdt результат равен 0.
В случае ошибки возвращается  -1,  а  переменной  errno
присваивается код ошибки.
ПРИМЕЧАНИЯ
Необходимо явно удалять разделяемый сегмент памяти после того, как удаляется последняя ссылка на него.
СЮРПРИЗЫ
В  данной  реализации результат системного вызова shmat
имеет тип int, а не char *.