msgget -
возвращает
идентификатор
очереди
сообщений
System V
Standard C library (
libc,
-lc)
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
Системный
вызов
msgget()
возвращает
идентификатор
очереди
сообщений
System V,
связанный
со
значением
аргумента
key. Его можно
использовать
для
получения
идентификатора
уже
созданной
очереди
сообщений
(если
msgflg
равно нулю
и значение
key не равно
IPC_PRIVATE) или для
создания
новой.
Новая
очередь
сообщений
создаётся,
если
значение
key
равно
IPC_PRIVATE,
или если
key
не равно
IPC_PRIVATE,не
существует
ни одной
очереди
сообщений
с заданным
ключом
key и в
поле
msgflg
указан
флаг
IPC_CREAT.
Если в
msgflg
одновременно
заданы
IPC_CREAT и
IPC_EXCL и с таким
key очередь
сообщений
уже
существует,
то
msgget()
завершится
с ошибкой и
errno будет
равно
EEXIST
(тот же
эффект как
для
комбинации
O_CREAT | O_EXCL у
open(2)).
При
создании
права
доступа к
очереди
сообщений
определяются
младшими
битами
параметра
msgflg. Эти биты
прав имеют
тот же
формат и
значение,
что и права
в
аргументе
mode у вызова
open(2) (право на
исполнение
не
используется).
Если
создаётся
новая
очередь
сообщений,
то этот
системный
вызов
инициализирует
структуру
данных
msqid_ds
(смотрите
msgctl(2))
следующим
образом:
- •
- Полям
msg_perm.cuid и msg_perm.uid
присваивается
эффективный
идентификатор
пользователя
вызывающего
процесса.
- •
- Полям
msg_perm.cgid и msg_perm.gid
присваивается
эффективный
идентификатор
группы
вызывающего
процесса.
- •
- Младшим 9
битам msg_perm.mode
присваивается
значение
младших 9
битов msgflg.
- •
-
msg_qnum, msg_lspid, msg_lrpid,
msg_stime и msg_rtime
присваивается
0.
- •
- В поле msg_ctime
записывается
текущее
время.
- •
- В поле msg_qbytes
записывается
системное
ограничение
MSGMNB.
Если
очередь
сообщений
уже
существует,
то
проверяются
права
доступа к
ней и не
помечена
ли она для
удаления.
On success,
msgget() returns the message queue identifier (a nonnegative
integer). On failure, -1 is returned, and
errno is set to indicate the
error.
- EACCES
- Очередь
сообщений
для ключа
key
существует,
но
вызывающий
процесс не
имеет прав
доступа к
ней и не
имеет
мандата
CAP_IPC_OWNER,
который
управляет
его
пространством
имён IPC.
- EEXIST
- В msgflg
указаны IPC_CREAT
и IPC_EXCL, но
очередь
сообщений
уже
существует
для key.
- ENOENT
- Для
ключа key не
существует
очереди
сообщений,
но в msgflg нет
флага IPC_CREAT.
- ENOMEM
- Очередь
сообщений
необходимо
создать, но
системе не
хватает
памяти для
хранения
новой
структуры
данных.
- ENOSPC
- Очередь
сообщений
необходимо
создать, но
лимит,
определяющий
количество
очередей
сообщений (
MSGMNI), уже
достигнут.
POSIX.1-2001, POSIX.1-2008, SVr4.
IPC_PRIVATE
является
не полем с
флагами, а
имеет тип
key_t. Если при
работе с
key
используется
это
специальное
значение,
то
системный
вызов
игнорирует
всё, кроме
9-ти младших
битов в
msgflg и
создаёт
новую
очередь
сообщений
(если это
возможно).
На вызов
msgget()
влияет
системное
ограничение
по
очередям
сообщений:
- MSGMNI
- Системное
ограничение
на
максимальное
количество
очередей
сообщений.
В системах
Linux до версии
3.19,
значением
по
умолчанию
этого
ограничения
рассчитывалось
на основе
формулы
зависящей
от
доступной
системной
памяти.
Начиная с Linux
3.19, значение
по
умолчанию
равно 32000. В Linux
это
ограничение
можно
прочитать
и изменять
через
/proc/sys/kernel/msgmni).
Until Linux 2.3.20, Linux would return
EIDRM for a
msgget() on a
message queue scheduled for deletion.
Имя
IPC_PRIVATE,
возможно,
было
выбрано
неудачно,
IPC_NEW
отражает
смысл
действия
более ясно.
msgctl(2),
msgrcv(2),
msgsnd(2),
ftok(3),
capabilities(7),
mq_overview(7),
sysvipc(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]