При успешном завершении системного вызова shmat() результат равен адресу, который получил присоединенный сегмент; в случае неудачи возвращается -1. Разумеется, чтобы использовать результат shmat() как указатель, его нужно преобразовать к требуемому типу.
В качестве аргумента shmid должен выступать идентификатор разделяемого сегмента, предварительно полученный при помощи системного вызова shmget.
Аргумент shmaddr задает адрес, по которому сегмент должен быть
присоединен, то есть тот адрес в виртуальном пространстве пользователя, который
получит начало сегмента. Не всякий адрес является приемлемым. Можно
порекомендовать адреса вида
0x80000000
0x80040000
0x80080000
. . .
Если значение shmaddr равно нулю, система выбирает адрес присоединения по своему
усмотрению.
Аргумент shmflg используется для передачи системному вызову shmat() флагов SHM_RND и SHM_RDONLY. Наличие первого из них означает, что адрес shmaddr следует округлить до некоторй системно-зависимой величины. Второй флаг предписывает присоединить сегмент только для чтения; если он не установлен, присоединенный сегмент будет доступен и на чтение, и на запись (если процесс обладает соответствующими правами).