mq_open -
открывает
очередь
сообщений
Real-time library (
librt,
-lrt)
#include <fcntl.h> /* Постоянные вида O_* */
#include <sys/stat.h> /* Постоянные для mode */
#include <mqueue.h>
mqd_t mq_open(const char *name, int oflag);
mqd_t mq_open(const char *name, int oflag, mode_t mode,
struct mq_attr *attr);
Функция
mq_open()
создает
новую
очередь
сообщений POSIX
или
открывает
существующую
очередь.
Очередь
опознаётся
по имени
name.
Для
получения
дополнительной
информации
о создании
имени
name,
смотрите
mq_overview(7).
В
параметре
oflag задаются
флаги,
которые
управляют
работой
вызова
(значения
флагов
могут быть
получены
при
включении
<fcntl.h>).
Поместить
в параметр
oflag можно
только
один из
ниже
приведенных
флагов:
- O_RDONLY
- Открыть
очередь
только для
получения
сообщений.
- O_WRONLY
- Открыть
очередь
только для
отправки
сообщений.
- O_RDWR
- Открыть
очередь
для
отправки и
получения
сообщений.
Также в
oflag
можно
добавить
ноль и
более
флагов,
объединённых
через ИЛИ:
-
O_CLOEXEC
(начиная с Linux
2.6.26)
- Установить
флаг close-on-exec на
файловом
дескрипторе
очереди
сообщений.
Описание
полезности
этого
флага
смотрите в
open(2).
- O_CREAT
- Создать
очередь
сообщений,
если она не
существует.
Владельцем
(ID
пользователя)
очереди
сообщений
назначается
эффективный
ID
пользователя
вызывающего
процесса.
Владельцем-группой
(ID группы)
назначается
эффективный
ID группы
вызывающего
процесса.
- O_EXCL
- Если в
поле oflag
выставлен
флаг O_CREAT и
очередь с
заданным
именем name
уже
существует,
то
завершить
вызов
ошибкой
EEXIST.
- O_NONBLOCK
- Открыть
очередь в
неблокирующем
режиме. При
обстоятельствах,
из-за
которых
mq_receive(3) и mq_send(3),
обычно,
блокируются,
теперь эти
функции
будут
завершаться
ошибкой
EAGAIN.
Если в
oflag
указан
O_CREAT,
требуется
задать два
дополнительных
аргумента.
В
аргументе
mode задаются
права
доступа к
новой
очереди,
как для
open(2)
(символические
определения
бит прав
можно
получить,
включив
<sys/stat.h>). В
настройках
прав
учитывается
umask процесса.
В полях
структуры
struct mq_attr, на
которую
указывает
attr, задаётся
максимальное
количество
сообщений
и
максимальный
размер
сообщений,
разрешённых
в очереди.
Эта
структура
определена
следующим
образом:
struct mq_attr {
long mq_flags; /* флаги (игнорируются в mq_open()) */
long mq_maxmsg; /* макс. кол-во сообщений в очереди */
long mq_msgsize; /* макс. размер сообщения (в байтах) */
long mq_curmsgs; /* кол-во сообщений в очереди в данный момент
(игнорируется в mq_open()) */
};
В функции
mq_open()
используются
только
поля
mq_maxmsg и
mq_msgsize;
остальные
значения
полей
игнорируются.
Если
attr
равно NULL, то
очередь
создаётся
с
атрибутами
по
умолчанию,
зависящими
от
реализации.
Начиная с Linux 3.5,
для
управления
атрибутами
по
умолчанию
можно
управлять
через два
файла в
/proc;
подробности
смотрите в
mq_overview(7).
При
успешном
выполнении
mq_open()
возвращает
файловый
дескриптор
очереди
для
использования
в других
функциях
работы с
очередями
сообщений.
При ошибке
mq_open()
возвращает
(mqd_t) -1, а в
errno
записывается
код ошибки.
- EACCES
- Очередь
существует,
но
вызывающий
не имеет
прав для её
открытия с
заданным в
mode режиме.
- EACCES
- Поле name
содержит
больше чем
одну косую
черту.
- EEXIST
- В oflag
указаны O_CREAT
и O_EXCL, но
очередь name
уже
существует.
- EINVAL
- Параметр
name не
соответствует
формату,
описанному
в mq_overview(7).
- EINVAL
- В oflag
указан O_CREAT и
attr не равно
NULL, но в attr->mq_maxmsg
или attr->mq_msqsize
содержится
некорректное
значение.
Оба этих
поля
должны
быть
больше
нуля. Если
процесс
без прав
(не имеет
мандата
CAP_SYS_RESOURCE), то attr->mq_maxmsg
должно
быть
меньше или
равно
ограничению
msg_max и attr->mq_msgsize
должно
быть
меньше или
равно
ограничению
msgsize_max. Также,
даже для
привилегированных
процессов,
значение
attr->mq_maxmsg не
должно
превышать
ограничения
HARD_MAX
(описание
ограничений
смотрите в
mq_overview(7)).
- EMFILE
- Было
достигнуто
ограничение
на
количество
открытых
дескрипторов
файлов и
очередей
сообщений
(смотрите
описание
RLIMIT_NOFILE в getrlimit(2)).
- ENAMETOOLONG
- Слишком
длинное
значение
аргумента
name.
- ENFILE
- Достигнуто
ограничение
на общее
количество
открытых
файлов в
системе и
очередей
сообщений.
- ENOENT
- В oflag не
указан O_CREAT и
не
существует
очередь name.
- ENOENT
- В name есть
только «/»
и нет
других
символов.
- ENOMEM
- Недостаточно
памяти.
- ENOSPC
- Недостаточно
места для
создания
новой
очереди
сообщений.
Вероятно,
это
произошло
из-за
ограничения
queues_max;
смотрите
mq_overview(7).
Описание
терминов
данного
раздела
смотрите в
attributes(7).
Интерфейс |
Атрибут |
Значение |
mq_open() |
Безвредность
в нитях |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
Библиотечная
функция
mq_open()
реализована
поверх
системного
вызова с
тем же
именем.
Библиотечная
функция
выполняет
проверку
того, что
name
начинается
с косой
черты (/) и
выдаёт
ошибку
EINVAL,
если это не
так.
Системный
вызов ядра
ожидает
name
без
начальной
косой
черты,
поэтому
библиотечная
функция C
передаёт в
системный
вызов
name без
начальной
косой
черты (т. е.,
name+1).
Before Linux 2.6.14, the process umask was not applied to the permissions
specified in
mode.
mq_close(3),
mq_getattr(3),
mq_notify(3),
mq_receive(3),
mq_send(3),
mq_unlink(3),
mq_overview(7)
Русский
перевод
этой
страницы
руководства
был сделан
aereiae <
[email protected]>, Alexey <
[email protected]>, Azamat
Hackimov <
[email protected]>, Dmitriy S. Seregin
<
[email protected]>, Dmitry Bolkhovskikh <
[email protected]>,
ITriskTI <
[email protected]>, Max Is <
[email protected]>, Yuri
Kozlov <
[email protected]>, Иван
Павлов <
[email protected]>
и Малянов
Евгений
Викторович
<
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]