SHMOP(2) SHMOP(2)
НАЗВАНИЕ
shmop - операции над разделяемыми сегментами памяти
СИНТАКСИС
#include
#include
#include
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 *.
|