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] Для ключа key уже существует идентификатор
разделяемого сегмента и выражение ((shmflg
& IPC_CREAT) & (shmflg & IPC_EXCL)) истин-
но.
СМ. ТАКЖЕ
intro(2), shmctl(2), shmop(2).
ДИАГНОСТИКА
При успешном завершении системного вызова возвращается
неотрицательное целое число - идентификатор разделяемо-
го сегмента памяти. В случае ошибки возвращается -1, а
переменной errno присваивается код ошибки.
ПРИМЕЧАНИЯ
Необходимо явно удалять разделяемый сегмент памяти пос-
ле того, как удаляется последняя ссылка на него.
|