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