Unix Man (Справочное руководство)

         

SHMOP(2)


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, к сегменту данных вызывающего процесса. Сегмент присоединяется по адресу, заданному одним из следующих способов:

  1. Если значение аргумента shmaddr равно нулю, то сегмент присоединяется по адресу, выбранному системой.
  2. Если значение аргумента shmaddr не равно нулю и выражение (shmflg & SHM_RND) истинно, то сегмент просоединяется по адресу, вычисляемому по формуле (shmaddr - (shmaddr mod SHMLBA)) [см. ].
  3. Если значение аргумента shmaddr не равно нулю и выражение (shmflg & SHM_RND) ложно, то сегмент присоединяется по адресу, задаваемому аргументом shmaddr.

Отсоединение сегмента

Системный вызов shmdt отсоединяет разделяемый сегмент памяти, расположенный по адресу shmaddr, от сегмента данных вызывающего процесса.

Если выражение (shmflg & SHM_RDONLY) истинно, то сегмент присоединяется для чтения {требуется право на чтение}, в противном случае сегмент присоединяется для чтения и записи {требуется право на чтение и запись}.

Системный вызов shmat завершается неудачей и разделяемый сегмент не присоединяется, если выполнено хотя бы одно из следующих условий:

[EINVAL] Значение аргумента shmid не является корректным идентификатором разделяемого сегмента. [EACCES] У вызывающего процесса нет прав на выполнение операции [см. ]. [ENOMEM] В сегменте данных нет места для присоединения разделяемого сегмента. [EINVAL] Значение аргумента shmaddr не равно нулю и значение выражения (shmaddr-(shmaddr mod SHMLBA)) не является корректным адресом. [EINVAL] Значение аргумента shmaddr не равно нулю, выражение (shmflg & SHM_RND) ложно и значение аргумента shmaddr не является корректным адресом. [EMFILE] Количество разделяемых сегментов, присоединенных к вызывающему процессу, превышает максимально допустимую величину.

Системный вызов shmdt завершается неудачей и разделяемый сегмент не отсоединяется, если:

[EINVAL] Значение аргумента shmaddr не является начальным адресом разделяемого сегмента.

СМ. ТАКЖЕ


, , , , , .

ДИАГНОСТИКА


При успешном завершении системного вызова shmat возвращается начальный адрес присоединенного сегмента.

При успешном завершении системного вызова shmdt результат равен 0.

В случае ошибки возвращается -1, а переменной errno присваивается код ошибки.

ПРИМЕЧАНИЯ


Необходимо явно удалять разделяемый сегмент памяти после того, как удаляется последняя ссылка на него.

СЮРПРИЗЫ


В данной реализации результат системного вызова shmat имеет тип int, а не char *.



Содержание раздела