[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Управление разделяемой памятью

Системный вызов shmctl(2) имеет следующие параметры
shmid - это идентификатор разделяемого сегмента, полученный от
успешного вызова shmget(2).
Команда cmd может принимать одно из следующих значений:
IPC_STAT       Копирует информацию о состоянии разделяемого сегмента в
               структуру, на которую указывает buf.

IPC_SET        Устанавливает хозяина, группу и права чтения/записи для
               хозяина, группы и других пользователей. Значения должны
               находиться в  структуре, на  которую указывает buf. Эту
               операцию могут  выполнять только  хозяин,  создатель  и
               суперпользоватедь.

IPC_RMID       Удаляет идентификатор разделяемого сегмента и разрушает
               сегмент  и   ассоциированную  с  ним  структуру  данных
               (дескриптор).       Только    хозяин,    создатель    и
               суперпользователь могут  удалить  разделяемый  сегмент.
               Эта  команда   не  делает   немедленного   освобождения
               ресурсов, она  скорее запрещает  дальнейшие shmget(2) и
               shmat(2). Когда  все присоединившиеся процессы закончат
               работу  с   сегментом  (shm_nattch  станет  равным  0),
               сегмент  будет   удален.  Если   удаления  не  сделать,
               разделяемый сегмент  будет существовать до перезагрузки
               системы, даже если к нему никто не присоединен.

SHM_LOCK       Закрепляет разделяемый  сегмент в  памяти. Эта  команда
               может быть  выполнена только процессом с эффективным ID
               пользователя равным суперпользователю.

SHM_UNLOCK     Открепляет разделяемый  сегмент. Эта команда может быть
               выполнена   только    процессом   с    эффективным   ID
               пользователя, равным суперпользователю.

Дескриптор разделяемого сегмента имеет следующую структуру:
struct shmid_ds {
       struct ipc_perm shm_perm;  /* operation permission struct */
       int shm_segsz;  /* size of segment in bytes */
       struct anon_map *shm_amp;  /* segment anon_map pointer */
       ushort shm_lkcnt;  /* number of times it is being locked */
       char pad[2];
       pid_t shm_lpid;  /* pid of last shmop */
       pid_t shm_cpid;  /* pid of creator */
       ulong shm_nattch;  /* used only for shminfo */
       ulong shm_cnattch;  /* used only for shminfo */
       time_t shm_atime;  /* last shmat time */
       long shm_atimfrac;  /* reserved for time_t expansion */
       time_t shm_dtime;  /* last shmdt time */
       long shm_dtimfrac;  /* reserved for time_t expansion */
       time_t shm_ctime;  /* last change time */
       long shm_ctimfrac;  /* reserved for time_t expansion */
       long pad1[4];  /* reserve area  */
};
                    УПРАВЛЕНИЕ РАЗДЕЛЯЕМОЙ ПАМЯТЬЮ
shmctl(2)

ИМЯ

     shmctl - операции по управлению разделяемой памятью

ИСПОЛЬЗОВАНИЕ

     #include <sys/types.h>
     #include <sys/ipc.h>
     #include <sys/shm.h>

     int shmctl (int shmid, int cmd, struct shmid_ds *buf)

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

     успех       - 0

     неуспех - -1 и errno установлена