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 присваивает- ся код ошибки. ПРИМЕЧАНИЯ Необходимо явно удалять разделяемый сегмент памяти пос- ле того, как удаляется последняя ссылка на него.