Опубликован: 06.12.2004 | Доступ: свободный | Студентов: 1179 / 142 | Оценка: 4.76 / 4.29 | Длительность: 20:58:00
ISBN: 978-5-9556-0021-5
Лекция 4:

Средства межпроцессного взаимодействия в реальном времени

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Аннотация: Рассматриваются средства локального межпроцессного взаимодействия в реальном времени - очереди сообщений, семафоры, разделяемые сегменты памяти.
Ключевые слова: очередь сообщений, открытие очереди, отправка сообщения в очередь, синхронный прием, асинхронный прием, атрибут очереди, удаление очереди сообщений, очередь, контроль, верхняя граница размера сообщений, приоритет сообщения, функция, описание открытой очереди, дескриптор типа, имя очереди сообщений, дескриптор очереди сообщений, файловый дескриптор, приложение, аргумент, запись, режим доступа, указатель, атрибутный объект, опрос атрибута очереди, установка атрибута очереди, дескриптор, отправка, байт, диапазон, длительность ожидания, буфер, значение, объект, сигнал реального времени, регистрация, поток, polling, целостность, размер сообщения, права, операции, программа, семафор реального времени, синхронизация процессов, разделяемый ресурс, захват семафора, освобождение семафора, множества, значение семафора, именованный семафор, безымянный семафор, неименованный семафор, имя семафора, режим доступа к семафору, SEM, ликвидация семафора, потоки управления, место, поставщик/потребитель, вывод, бинарный семафор, целочисленный семафор, конфликт, разделяемый сегмент памяти, передача данных между процессами, объект в разделяемой памяти, память, интерфейс, средство межпроцессного взаимодействия, адрес, доступ, файловый ввод/вывод, файл, execl, позиционирование, порожденный процесс, межпроцессное взаимодействие

Передача и прием сообщений в реальном времени

Средства локальной передачи и приема сообщений присутствуют, вероятно, во всех или почти во всех операционных системах. Во многих версиях ОС Unix представлено по нескольку разновидностей подобных средств. Следуя за исторически сложившимися реализациями, стандарт POSIX-2001 предусматривает два вида очередей сообщений и обслуживающих их функций. Один из них был рассмотрен нами в курсе [1]. Здесь мы опишем вторую разновидность, предназначенную для использования в системах реального времени.

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

Над очередями сообщений определены следующие группы функций:

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

Одну очередь могут открыть несколько посылающих и/или принимающих сообщения процессов. При открытии может производиться контроль прав доступа.

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

На порядок приема влияет имеющийся механизм приоритетов сообщений.

Процесс может получать асинхронные уведомления о том, что в очереди появилось сообщение.

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

#include <mqueue.h>
mqd_t mq_open (
    const char *name, int oflag, ...);
Листинг 4.1. Описание функции mq_open().

Трактовка имени очереди (аргумент name ) зависит от реализации. Оговаривается только, что оно должна подчиняться ограничениям, налагаемым на маршрутные имена, и что если его первым символом является ' / ', то процессы, вызывающие mq_open() с одинаковыми значениями name, ссылаются на одну и ту же очередь (если, конечно, ее не удаляли).

При реализации дескрипторов очередей сообщений могут применяться файловые дескрипторы. В таком случае приложение может открыть не менее OPEN_MAX файлов и очередей.

Аргумент oflag специфицирует запрашиваемые виды доступа к очереди: на прием (чтение) и отправку (запись). Контроль прав доступа для очередей сообщений производится так же, как и для файлов.

В целом набор флагов и их трактовка для очередей сообщений те же, что и для файлов: O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_NONBLOCK.

Если установлен флаг O_CREAT, то при вызове функции mq_open() необходимо задать два дополнительных аргумента: режим доступа (тип mode_t ) и указатель на атрибутный объект (тип struct mq_attr * ) создаваемой очереди сообщений.

Согласно стандарту POSIX-2001, структура типа mq_attr, описанная в заголовочном файле <mqueue.h>, содержит по крайней мере следующие поля.

long mq_flags;  
    /* Флаги очереди сообщений          */
long mq_maxmsg; 
	/* Максимальное число сообщений 
	   в очереди  */
long mq_msgsize;
	/* Максимальный размер сообщения 
	   в очереди */
long mq_curmsgs;
	/* Текущее число сообщений в очереди */

Для опроса и/или установки атрибутов очереди служат функции mq_getattr() и mq_setattr() (см. листинг 4.2). Впрочем, про установку атрибутов сказано, пожалуй слишком сильно: посредством вызова 2 можно изменить лишь состояние флага 2 (и, возможно, некоторых других флагов, зависящих от реализации).

#include <mqueue.h>

int mq_getattr (
    mqd_t mqdes, struct mq_attr *mqstat);

int mq_setattr (mqd_t mqdes, 
	const struct mq_attr *restrict mqstat, 
	struct mq_attr *restrict omqstat);
Листинг 4.2. Описание функций mq_getattr() и mq_setattr().

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

#include <mqueue.h>
int mq_close (mqd_t mqdes);
Листинг 4.3. Описание функции mq_close().

Если очередь сообщений стала совсем ненужной, ее можно удалить с помощью функции mq_unlink() (см. листинг 4.4).

#include <mqueue.h>
int mq_unlink (const char *name);
Листинг 4.4. Описание функции mq_unlink().
< Лекция 3 || Лекция 4: 1234 || Лекция 5 >