Читаем Linux API. Исчерпывающее руководство полностью

Рис. 48.1.Связь между структурами данных ядра для очередей POSIX-сообщений

Рисунок 48.1 помогает прояснить пару моментов относительно использования дескрипторов очередей сообщений (каждый из которых является аналогом файлового дескриптора).

• Описание открытой очереди сообщений содержит набор флагов. Стандарт SUSv3 предусматривает только один такой флаг, O_NONBLOCK, определяющий, должен ли ввод/вывод быть неблокирующим.

• Два разных процесса могут обладать дескрипторами (на диаграмме обозначены как x), которые ссылаются на одно и то же описание открытой очереди сообщений. Это может произойти, если процесс вызовет fork() после открытия очереди. Такие дескрипторы разделяют состояние флага O_NONBLOCK.

• Два разных процесса могут обладать открытыми дескрипторами, ссылающимися на разные описания, связанные с одной и той же очередью сообщений (например, дескриптор z в процессе А и дескриптор y в процессе Б ссылаются на /mq-r). Это происходит в ситуации, когда оба процесса задействуют функцию mq_open() для открытия одной и той же очереди.

48.4. Атрибуты очередей сообщений

Каждая из трех функций — mq_open(), mq_getattr() и mq_setattr() — принимает аргумент, который является указателем на структуру mq_attr. Она определена в заголовочном файле и имеет следующий вид:

struct mq_attr {

long mq_flags; /* Флаги описания очереди сообщений: 0 или

O_NONBLOCK [mq_getattr(), mq_setattr()] */

long mq_maxmsg; /* Максимальное количество сообщений в

очереди [mq_open(), mq_getattr()] */

long mq_msgsize; /* Максимальный размер сообщения (в байтах)

[mq_open(), mq_getattr()] */

long mq_curmsgs; /* Количество сообщений в очереди на текущий

момент [mq_getattr()] */

};

Прежде чем приступить к подробному рассмотрению структуры mq_attr, необходимо отметить следующее.

• Только часть этих полей используется всеми тремя функциями. Функции, в которых применяется каждое из полей, обозначены в комментариях к определению структуры (см. выше).

• Структура содержит сведения об описании открытой очереди сообщений (mq_flags), связанной с дескриптором сообщения и информацией об очереди, на которую тот ссылается (mq_maxmsg, mq_msgsize, mq_curmsgs).

• Часть полей содержит информацию, записанную на момент создания очереди с помощью функции mq_open() (mq_maxmsg и mq_msgsize); в других хранятся сведения о текущем состоянии описания открытой очереди сообщений (mq_flags) или о самой очереди (mq_curmsgs).

Установка атрибутов очереди сообщений во время ее создания

При создании очереди сообщений с помощью вызова mq_open() ее атрибуты определяются следующими полями структуры mq_attr:

• поле mq_maxmsg определяет максимальное количество сообщений, которое можно поместить в очередь, используя вызов mq_send(). Это значение должно быть больше 0;

• поле mq_msgsize определяет максимальный размер каждого сообщения, которое может оказаться в очереди. Это значение тоже должно быть больше 0.

Вместе оба поля позволяют ядру определить максимальный объем памяти, который может потребоваться для данной очереди сообщений.

Атрибуты mq_maxmsg и mq_msgsize инициализируются во время создания очереди и больше не могут быть изменены. В разделе 48.8 мы опишем два файла в каталоге /proc, устанавливающие общесистемное ограничение на значения, которые можно присвоить атрибутам mq_maxmsg и mq_msgsize.

Программа из листинга 48.2 предоставляет интерфейс командной строки к функции mq_open() и демонстрирует применение структуры mq_attr.

Чтобы задать атрибуты очереди сообщений, предусмотрено два параметра командной строки: — m для mq_maxmsg и — s для mq_msgsize. При указании любого из них функции mq_open() будет передан ненулевой аргумент attrp. Полям структуры mq_attr, на которую указывает этот аргумент, по умолчанию присваиваются некие значения (при условии, что был указан только один из параметров командной строки). Если ни один из параметров не указан, то функции mq_open() в качестве аргумента attrp передается значение NULL. В таком случае очередь сообщений создается с атрибутами, применяемыми по умолчанию в текущей системе.

Листинг 48.2. Создание очереди сообщений POSIX

pmsg/pmsg_create.c

#include

#include

#include

#include "tlpi_hdr.h"

static void

usageError(const char *progName)

{

fprintf(stderr, "Usage: %s [-cx] [-m maxmsg] [-s msgsize] mq-name "

"[octal-perms]\n", progName);

fprintf(stderr, " — c Create queue (O_CREAT)\n");

fprintf(stderr, " — m maxmsg Set maximum # of messages\n");

fprintf(stderr, " — s msgsize Set maximum message size\n");

fprintf(stderr, " — x Create exclusively (O_EXCL)\n");

exit(EXIT_FAILURE);

}

int

main(int argc, char *argv[])

{

int flags, opt;

mode_t perms;

mqd_t mqd;

struct mq_attr attr, *attrp;

attrp = NULL;

attr.mq_maxmsg = 10;

attr.mq_msgsize = 2048;

flags = O_RDWR;

/* Разбираем параметры командной строки */

while ((opt = getopt(argc, argv, "cm: s: x"))!= -1) {

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных