[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Управление очередью сообщений

Собственность и  права доступа  для очереди устанавливаются при вызове
msgget(2)  с  флагом  IPC_CREAT.  Эти  атрибуты  могут  быть  изменены
системным вызовом msgctl(2). Его аргументы:

msgid  -   идентификатор  очереди,   полученный  от  успешного  вызова
msgget(2).

cmd может принимать одно из следующих значений:
.  IPC_STAT    - Записывает  состояние очереди в структуру, на которую
                  указывает buf.

.  IPC_SET     -   Используется для  установки пользователя,  группы и
                  права  чтения/записи   для  пользователя,  группы  и
                  других. Значения  берутся из  структуры, на  которую
                  указывает buf.

                  Системный   параметр    настройки   MSGMNB    задает
                  максимальный размер  очереди. Значение  по умолчанию
                  равно 4096  байт. IPC_SET может быть использован для
                  уменьшения   размера    данной    очереди.    Только
                  суперпользователь может увеличивать размер.

.  IPC_RMID    -  Удаляет очередь и ее дескриптор.


 1  struct msqid_ds {
 2  struct ipc_perm msg_perm;/* operation permission */
 3  struct msg*msg_first;/* ptr to first message on q */
 4  struct msg*msg_last;/* ptr to last message on q */
 5  ulong msg_cbytes;/* current # bytes on q */
 6  ulong msg_qnum;/* # of messages on q */
 7  ulong msg_qbytes;/* max # of bytes on q */
 8  pid_t msg_lspid;/* pid of last msgsnd */
 9  pid_t msg_lrpid;/* pid of last msgrcv */
10  time_t msg_stime;/* last msgsnd time */
11  long msg_stimfrac;/* reserved for time_t expansion */
12  time_t msg_rtime;/* last msgrcv time */
13  long msg_rtimfrac;
14  time_t msg_ctime;/* last change time */
15  long msg_ctimfrac;
16  long pad[4];/* reserve area */
17  };
                    УПРАВЛЕНИЕ ОЧЕРЕДЬЮ СООБЩЕНИЙ
msgctl(2)

ИМЯ

    msgctl - операции управления очередью сообщений

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

    #include <sys/types.h>
    #include <sys/ipc.h>
    #inlcude <sys/msg.h>

    int msgctl (int msgid,int cmd,struct msgid_ds*
     buf);

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

    успех     - 0

    неуспех  - -1 и errno установлена
                          msgctl(2) - Пример

. объявления             Переменная     msgid     должна     содержать
                         идентификатор очереди,  полученный при вызове
                         msgget(2).   Структура    данных   ds   будет
                         содержать  информацию  о  состоянии  заданной
                         очереди.  Структура   msqid_ds  определена  в
                         <sys/msg.h>.

. удаление               Очередь должна  удаляться только тогда, когда
                         она больше  не нужна  всем использовавшим  ее
                         процессам. Когда  задается команда  IPC_RMID,
                         последний аргумент может быть любым.

                         Замечание: Перед  тем, как  изменять хозяина,
                         права доступа  и т.д.  для средства  IPC, для
                         него   должно    быть   определено    текущее
                         состояние.

. изменение хозяина      После копирования информации в структуру типа
                         struct msgid_ds, поле msg_perm.uid может быть
                         установлено равным  числовому  идентификатору
                         пользователя нового хозяина, и хозяин очереди
                         будет изменен  системным вызовом  msgctl(2) с
                         командой IPC_SET.

                         Группа  может   быть   изменена   аналогичным
                         образом. Библиотечные  функции getpwnam(2)  и
                         getgrnam(2)     соответственно     отображают
                         символические имена  пользователя и  группы в
                         числовые идентификаторы.  Эти  функции  можно
                         использовать,   если   вы   хотите   задавать
                         пользователя/группу символически.

. изменение прав доступа Права  определяют,   кто  может   посылать  и
                         получать сообщения  из  заданной  очереди,  и
                         могут быть изменены вызовом msgctl(2).

. изменение ограничения на размер  Используя msgctl(2)  можно изменить
                         максимальный размер  очереди, т.е. количество
                         байтов,   которые    она   может    содержать
                         (msg_qbytes).

                         Замечание:   Shell-команда    ipcs   -q    -b
                         показывает упоминавшееся выше ограничение.
                         msgctl(2) - ПРИМЕРЫ
. объявления переменных

    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    int msgid;
    struct msgid_ds ds;

. удаление

    msgctl(msgid, IPC_RMID, NULL);

. изменение хозяина

    msgctl(msgid, IPC_STAT, &ds);
    ds.msg_perm.uid = 51; /*new uid*/
    msgctl(msgid, IPC_SET, &ds);

. изменение прав доступа

    msgctl(msgid, IPC_STAT, &ds);
    ds.msg_perm.mode = 0660;
    msgctl(msgid, IPC_SET, &ds);

. изменение ограничение на размер

    msgctl(msgid, IPC_STAT, &ds);
    ds.msg_qbytes = 3000;
    msgctl(msgid, IPC_SET, &ds);