SHMGET(2) SHMGET(2) НАЗВАНИЕ shmget - получение идентификатора разделяемого сегмента памяти СИНТАКСИС |#include |#include |#include | |int shmget (key, size, shmflg) |key_t key; |int size, shmflg; ОПИСАНИЕ Системный вызов shmget возвращает идентификатор разде- ляемого сегмента памяти, ассоциированный с ключом key. Идентификатор и ассоциированные с ним структура данных и разделяемый сегмент размером по меньшей мере size байт [см. intro(2)] создаются для ключа key в следующих случаях: 1. Значение аргумента key равно IPC_PRIVATE. 2. Ключ key пока еще не имеет ассоциированного с ним идентификатора и выражение (shmflg & IPC_CREAT) истинно. При создании структуры данных, ассоциированной с новым идентификатором разделяемого сегмента памяти, выполня- ются следующие инициализирующие действия: 1. Значения полей shm_perm.cuid, shm_perm.uid, shm_perm.cgid и shm_perm.gid устанавливаются рав- ными действующему идентификатору пользователя и, соответственно, действующему идентификатору группы вызывающего процесса. 2. Младшие 9 бит поля shm_perm.mode устанавливаются равными 9 младшим битам аргумента shmflg; значение поля shm_segsz устанавливается равным аргументу size; 3. Значения полей shm_lpid, shm_nattch, shm_atime и shm_dtime устанавливаются равными 0. 4. Значение поля shm_ctime устанавливается равным те- кущему времени. Системный вызов shmget завершается неудачей, если вы- полнено хотя бы одно из следующих условий: [EINVAL] Значение аргумента size меньше минимального или больше максимального значения, принятых в системе. [EACCES] Для ключа key уже существует идентификатор разделяемого сегмента, но не могут быть предоставлены права доступа [см. intro(2)] определенные в 9 младших битах аргумента shmflg. [EINVAL] Для ключа key уже существует идентификатор разделяемого сегмента, но размер сегмента меньше значения аргумента size и значение size не равно нулю. [ENOENT] Для ключа key не существует идентификатор разделяемого сегмента и выражение (shmflg & IPC_CREAT) ложно. [ENOSPC] Идентификатор не создается из-за превышения максимального разрешаемого системой коли- чества идентификаторов разделяемых сегмен тов. [ENOMEM] Идентификатор и ассоциированный с ним раз- деляемый сегмент памяти не создаются из-за отсутствия достаточного количества памяти. [EEXIST разделяемого сегмента и выражение ((shmflg & IPC_CREAT) & (shmflg & IPC_EXCL)) истин- но. СМ. ТАКЖЕ intro(2), shmctl(2), shmop(2). ДИАГНОСТИКА При успешном завершении системного вызова возвращается неотрицательное целое число - идентификатор разделяемо- го сегмента памяти. В случае ошибки возвращается -1, а переменной errno присваивается код ошибки. ПРИМЕЧАНИЯ Необходимо явно удалять разделяемый сегмент памяти пос- ле того, как удаляется последняя ссылка на него.