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