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)) [см. intro(2)].
  3. Если значение аргумента 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 *.