Руководство программиста для Linux


Очереди сообщений - часть 3


Хотя большинство элементов этой структуры вас будет мало волновать, для какой-то законченности мы вкратце поясним каждый.

msg_perm

Экземпляр структуры ipc_perm, определенной в linux/ipc.h. Она содержит информацию о доступе для очереди сообщений, включая права доступа и информацию о создателе сообщения (uid и т.п.).

msg_first

Ссылка на первое сообщение в очереди (голова списка).

msg_last

Ссылка на последний элемент списка (хвост списка).

msg_stime

Момент времени (time_t) посылки последнего сообщения из очереди.

msg_rtime

Момент времени последнего изъятия элемента из очереди.

msg_ctime

Момент времени последнего изменения, проделанного в очереди (подробнее об этом позже).

wwait и rwait

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

msg_cbytes

Число байт, стоящих в очереди (суммарный размер всех сообщений).

msg_qnum

Количество сообщений в очереди на настоящий момент.

msg_qbytes

Максимальный размер очереди.

msg_lspid

PID процесса, пославшего последнее в очереди сообщение.

msg_lrpid

PID последнего процесса, взявшего из очереди сообщение.

Структура ipc_perm ядра

Информацию о доступе к IPC-объектам ядро хранит в структуре ipc_perm. Например, описанная выше структура очереди сообщений содержит одну структуру типа ipc_perm в качестве элемента. Следующее ее определение дано в linux/ipc.h. struct ipc_perm { key_t key; ushort uid; /* euid и egid владельца */ ushort gid; ushort cuid; /* euid и egid создателя */ ushort cgid; ushort mode; /* режим доступа, см. режимные флаги ниже */ ushort seq; /* порядковый номер использования гнезда */ };

Все приведенное выше говорит само за себя. Сохраняемая отдельно вместе с ключом IPC-объекта информация содержит данные о владельце и создателе этого объекта (они могут различаться). Режимы восьмеричного доступа также хранятся здесь, как unsigned short. Наконец, сохраняется порядковый номер использования гнезда. Каждый раз когда IPC объект закрывается через системный вызов (уничтожается), этот номер уменьшается на максимальное число объектов IPC, которые могут находиться в системе. Касается вас это значение? Нет.

Системный вызов msgget() нужен для того, чтобы создать очередь сообщений или подключиться к существующей. SYSTEM CALL: msgget() PROTOTYPE: int msgget( key_t key, int msgflg ); RETURNS: идентификатор очереди сообщений в случае успеха; -1 в случае ошибки. При этом errno = EACCESS (доступ отклонен) EEXIST (такая очередь уже есть, создание невозможно) EIDRM (очередь помечена как удаляемая) ENOENT (очередь не существует) ENOMEM (не хватает памяти для создания новой очереди) ENOSPC (исчерпан лимит на количество очередей)




Начало  Назад  Вперед