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. Если выражение (shmflg & SHM_RDONLY) истинно, то сег- мент присоединяется для чтения {требуется право на чте- ние}, в противном случае сегмент присоединяется для чтения и записи {требуется право на чтение и запись}. Системный вызов shmat завершается неудачей и разделяе мый сегмент не присоединяется, если выполнено хотя бы одно из следующих условий: [EINVAL] Значение аргумента shmid не является кор- ректным идентификатором разделяемого сег- мента. [EACCES] У вызывающего процесса нет прав на выполне- ние операции [см. intro(2)]. [ENOMEM] В сегменте данных нет места для присоедине- ния разделяемого сегмента. [EINVAL] Значение аргумента shmaddr не равно значение выражения (shmaddr-(shmaddr mod SHMLBA)) не является корректным адресом. [EINVAL] Значение аргумента shmaddr не равно нулю, выражение (shmflg & SHM_RND) ложно и значе ние аргумента shmaddr не является коррект ным адресом. [EMFILE] Количество разделяемых сегментов, присоеди- ненных к вызывающему процессу, превышает максимально допустимую величину. Отсоединение сегмента Системный вызов shmdt отсоединяет разделяемый сегмент памяти, расположенный по адресу shmaddr, от сегмента данных вызывающего процесса. Системный вызов shmdt завершается неудачей и разделя мый сегмент не отсоединяется, если: [EINVAL] Значение аргумента shmaddr не является на чальным адресом разделяемого сегмента. СМ. ТАКЖЕ exec(2), exit(2), fork(2), intro(2), shmctl(2), shmget(2). ДИАГНОСТИКА При успешном завершении системного вызова shmat возвра щается начальный адрес присоединенного сегмента. При успешном завершении системного вызова shmdt резуль- тат равен 0. В случае ошибки возвращается -1, а переменной errno присваивается код ошибки. ПРИМЕЧАНИЯ Необходимо явно удалять разделяемый сегмент памяти пос- ле того, как удаляется последняя ссылка на него. СЮРПРИЗЫ В данной реализации результат системного вызова shmat имеет тип int, а не char *.