SHMCTL(2) SHMCTL(2)
НАЗВАНИЕ
shmctl - операции управления разделяемыми сегментами
памяти
СИНТАКСИС
#include
#include
#include
int shmctl (shmid, cmd, buf)
int shmid, cmd;
struct shmid_ds *buf;
ОПИСАНИЕ
Системный вызов shmctl позволяет выполнять операции уп-
равления разделяемыми сегментами памяти. Операция опре-
деляется значением аргумента cmd, которое должно быть
одним из следующих:
IPC_STAT
Поместить текущие значения полей структуры данных,
ассоциированной с идентификатором разделяемого
сегмента shmid, в структуру, на которую указывает
аргумент buf. Содержимое структуры описано в
intro(2). {Требуется право на чтение.}
IPC_SET
Присвоить следующим полям структуры данных, ассо-
циированной с идентификатором shmid, соответствую-
щие значения, находящиеся в структуре, на которую
указывает аргумент buf:
shm_perm.uid
shm_perm.gid
shm_perm.mode /* Только младшие 9 бит */
Эта команда может выполняться только процессом,
который имеет действующий идентификатор пользова-
теля, равный либо идентификатору суперпользовате-
ля, либо значению поля shm_perm.cuid или
shm_perm.uid в структуре, ассоциированной с иден-
тификатором shmid.
IPC_RMID
Удалить из системы идентификатор разделяемого сег-
мента, заданный аргументом shmid, ликвидировать
сегмент и ассоциированную с ним структуру данных.
Эта команда может выполняться только процессом,
который имеет действующий идентификатор пользова-
теля, равный либо идентификатору суперпользовате-
ля, либо значению поля shm_perm.cuid или
shm_perm.uid в структуре данных, ассоциированной с
идентификатором shmid.
SHM_LOCK
Удержать в памяти разделяемый сегмент, специфици-
рованный идентификатором shmid. Эта команда может
выполняться только процессом, который имеет дейст-
вующий идентификатор пользователя, равный иденти-
фикатору суперпользователя.
SHM_UNLOCK
Освободить разделяемой сегмент памяти, специфици-
рованный идентификатором shmid. Эта команда может
выполняться только процессом, который имеет дейст-
вующий идентификатор пользователя, равный иденти-
фикатору суперпользователя.
Системный вызов shmctl завершается неудачей, если вы-
полнено хотя бы одно из следующих условий:
[EINVAL] Значение аргумента shmid не является кор-
ректным идентификатором разделяемого сег-
мента.
[EINVAL] Некорректное значение аргумента cmd, опре-
деляющее команду.
[EACCES] Значение аргумента cmd равно IPC_STAT, но у
вызывающего процесса нет прав на выполнение
операции чтения [см. intro(2)].
[EPERM] Значение аргумента cmd равно IPC_RMID или
IPC_SET, а действующий идентификатор поль-
зователя вызывающего процесса не равен ни
идентификатору суперпользователя, ни значе-
нию поля shm_perm.cuid или shm_perm.uid в
структуре данных, ассоциированной с иденти-
фикатором shmid.
[EPERM] Значение аргумента cmd равно SHM_LOCK или
SHM_UNLOCK, а действующий идентификатор
пользователя вызывающего процесса не равен
идентификатору суперпользователя.
[EFAULT] Аргумент buf указывает за пределы отведен-
ного процессу адресного пространства.
[ENOMEM] Значение аргумента cmd равно SHM_LOCK и нет
достаточного объема памяти в системе.
СМ. ТАКЖЕ
shmget(2), shmop(2).
ДИАГНОСТИКА
При успешном завершении результат равен 0; в случае
ошибки возвращается -1, а переменной errno присваивает-
ся код ошибки.
ПРИМЕЧАНИЯ
Необходимо явно удалять разделяемый сегмент памяти пос-
ле того, как удаляется последняя ссылка на него.
|