Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 58 стр.

UptoLike

Составители: 

58
oflag – флаги, определяющие режим доступа. Вы должны специфицировать
O_RDONLY (только для чтения), O_WRONLY (только для записи) или O_RDWR (для чтения и
записи). Кроме того, для получения дополнительных эффектов, к этим флагам по «ИЛИ» мож-
но добавить следующие константы:
- O_CREAT – инструктирует сервер создать новую очередь, если имя, указанное в аргу-
менте name, не существует,
- O_EXCL – используется вместе с флагом O_CREAT. Если очередь с указанным именем
существует, то вызов не исполняется и возвращается ошибка в глобальной переменной errno
с кодом EEXIST. При одиночном использовании данного флага он игнорируется,
- O_NONBLOCK – при сброшенном флаге вызовы mq_send() или mq_receive() могут
быть заблокированы, если очередь полна или, наоборот, пуста. Если флаг установлен, то вы-
зовы никогда не блокируются, но происходит возврат с установленной ошибкой EAGAIN в гло-
бальной переменной errno;
mode – аргумент присутствует в вызове mq_open(), только если установлен флаг
O_CREAT, и определяет для новой очереди файловые разрешения для типовых категорий
пользователей: собственник, член группы и прочие. Разрешения задаются с помощью сим-
вольных констант представленных в табл. 3.13;
mq_attr – опциональный аргумент присутствует в вызове mq_open(), только если уста-
новлен флаг O_CREAT. Указывает на структуру mq_attr, которая содержит атрибуты для но-
вой очереди сообщений. Структура имеет следующий набор полей:
- long mq_flags – флаги очереди,
- long mq_maxmsg – максимальное число сообщений в очереди,
- long mq_msgsize – максимальный размер каждого сообщения,
- long mq_curmsgs – число сообщений, непрерывно сохраняемых в данной очереди,
- long mq_sendwait – число потоков, непрерывно ожидающих пересылки сообщения. Не-
нулевое значение в этом поле означает, что очередь заполнена полностью,
- long mq_recvwait – число потоков, непрерывно ожидающих приема сообщения. Нену-
левое значение в этом поле означает, что очередь пуста.
Значения полей структуры mq_attr для существующей очереди можно получить с помо-
щью вызова mq_getattr() и установить с помощью вызова mq_setattr(). Если аргумент mq_attr
имеет значение NULL, то создается новая очередь с атрибутами:
- mq_maxmsg: 1024 // число сообщений в очереди,
- mq_msgsize: 4096 // максимальный размер сообщений,
- mq_flags: 0 // флаги.
Таблица 3.13
Собственник Член группы Прочие Разрешения
S_IRUSR S_IRGRP S_IROTH Чтение
S_IRWXU S_IRWXG S_IRWXO Чтение/запись/исполнение (поиск)
S_IWUSR S_IWGRP S_IWOTH Запись
S_IXUSR S_IXGRP S_IXOTH Исполнение (поиск)
Для передачи и приема сообщения используются вызовы mq_send() и
mq_receive(). Синтаксис этих вызовов представлен в следующем фрагмен-
те. Эти вызовы не блокируют поток, а в случае неудачи возвращают значе-
ние –1 и код ошибки в глобальной переменной errno.
int mq_send (mqd_t mqdes, // дескриптор очереди
const char * msg_ptr, // указатель к сообщению
size_t msg_len, // размер сообщения
unsigned int msg_prio ); // приоритет сообщения
Приоритет для сообщений может быть установлен в диапазоне от 0 до (MQ_PRIO_MAX-
1). Константа MQ_PRIO_MAX устанавливается при запуске сервера mqueue. Вместо функции