[<<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);