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

• Аргумент mode представляет собой битовую маску, которая определяет права доступа для новой очереди сообщений. Можно указывать те же битовые значения, что и для файлов (см. табл. 15.4; кроме того, как и в случае с вызовом open(), к маске mode применяется атрибут umask (см. подраздел 15.4.6). Чтобы читать из очереди (mq_receive()), соответствующий класс пользователей должен получить права для чтения; для передачи данных в очередь (mq_send()) требуются права на запись.

• Аргумент attr представляет собой структуру mq_attr, определяющую атрибуты новой очереди сообщений. Если он равен NULL, то очередь создается с атрибутами по умолчанию, которые действуют в текущей системе. Мы опишем структуру mq_attr в разделе 48.4.

В случае успешного выполнения функция mq_open() возвращает дескриптор очереди сообщений — значение типа mqd_t, которое будет применяться в последующих вызовах для обращения к этой открытой очереди. В стандарте SUSv3 есть только одно замечание относительно данного значения: оно не должно быть массивом; то есть это обязательно должен быть тип, пригодный для использования в операции присваивания или передачи по значению в качестве аргумента функции (в Linux тип mqd_t тождественен int, но в Solaris, к примеру, определен как void *).

Образец применения функции mq_open() показан в листинге 48.2.


Влияние fork(), exec() и завершения процесса на дескрипторы очередей сообщений

Во время вызова fork() дочерний процесс получает копии дескрипторов очередей сообщений, открытых его родителем, и эти дескрипторы ссылаются на те же очереди (подробней о дескрипторах очередей сообщений речь пойдет в разделе 48.3). Потомок не наследует от родителя подписки на уведомления о сообщениях.

Когда процесс выполняет вызов exec() или завершается, все дескрипторы открытых им очередей сообщений закрываются. В результате этого все подписки процесса на оповещения о поступлении сообщений в соответствующие очереди отменяются.


Закрытие очереди сообщений

Функция mq_close() закрывает дескриптор очереди сообщений mqdes.

#include


int mq_close(mqd_t mqdes);

Возвращает 0 при успешном завершении или -1 при ошибке

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

Дескриптор очереди сообщений автоматически закрывается при завершении процесса или вызове exec(). По аналогии с файловыми, дескрипторы очередей сообщений, которые больше не нужны, следует закрывать вручную, чтобы не столкнуться с проблемой превышения ограничения на количество открытых дескрипторов.

Закрывая очередь сообщений, мы ее не удаляем (точно так же, как, вызывая close(), мы не удаляем сам файл). Для удаления очередей предусмотрена функция mq_unlink(), аналогичная вызову unlink().


Удаление очереди сообщений

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

#include


int mq_unlink(const char *name);

Возвращает 0 при успешном завершении или -1 при ошибке

Пример использования функции mq_unlink() показан в листинге 48.1.


Листинг 48.1. Применение функции mq_unlink() для удаления очереди POSIX-сообщений

pmsg/pmsg_unlink.c

#include

#include "tlpi_hdr.h"


int

main(int argc, char *argv[])

{

if (argc!= 2 || strcmp(argv[1], "-help") == 0)

usageErr("%s mq-name\n", argv[0]);


if (mq_unlink(argv[1]) == -1)

errExit("mq_unlink");

exit(EXIT_SUCCESS);

}

pmsg/pmsg_unlink.c


48.3. Связь между дескрипторами и очередями сообщений


Данная связь аналогична отношениям между файловым дескриптором и самим открытым файлом (см. рис. 5.2). Дескриптор очереди сообщений принадлежит конкретному процессу и ссылается на запись в общесистемной таблице открытых дескрипторов этого типа; данная запись в свою очередь указывает на объект очереди. Эта связь проиллюстрирована на рис. 48.1.

В Linux очереди POSIX-сообщений реализованы в виде индексных дескрипторов (i-node) в виртуальной файловой системе; дескрипторы таких очередей представляют собой файловые дескрипторы (обычные и открытые). Однако с точки зрения стандарта SUSv3 эти аспекты реализации не являются обязательными и неактуальны в некоторых других UNIX-системах. Мы еще вернемся к данному вопросу в разделе 48.7, поскольку Linux предоставляет ряд нестандартных возможностей, основанных на особенностях именно этой реализации.



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

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

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

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

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

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

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

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