Man pages на русском

         

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.
  4. Отсоединение сегмента

    Системный вызов 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 *.









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