msgget(2) | System Calls Manual | msgget(2) |
ИМЯ
msgget - возвращает идентификатор очереди сообщений System V
LIBRARY
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-2008.
ИСТОРИЯ
POSIX.1-2001, SVr4.
Linux
Until Linux 2.3.20, Linux would return EIDRM for a msgget() on a message queue scheduled for deletion.
ПРИМЕЧАНИЯ
IPC_PRIVATE является не полем с флагами, а имеет тип key_t. Если при работе с key используется это специальное значение, то системный вызов игнорирует всё, кроме 9-ти младших битов в msgflg и создаёт новую очередь сообщений (если это возможно).
На вызов msgget() влияет системное ограничение по очередям сообщений:
- MSGMNI
- Системное ограничение на максимальное количество очередей сообщений. В системах Linux до версии 3.19, значением по умолчанию этого ограничения рассчитывалось на основе формулы зависящей от доступной системной памяти. Начиная с Linux 3.19, значение по умолчанию равно 32000. В Linux это ограничение можно прочитать и изменять через /proc/sys/kernel/msgmni).
ОШИБКИ
Имя IPC_PRIVATE, возможно, было выбрано неудачно, IPC_NEW отражает смысл действия более ясно.
СМОТРИТЕ ТАКЖЕ
msgctl(2), msgrcv(2), msgsnd(2), ftok(3), capabilities(7), mq_overview(7), sysvipc(7)
ПЕРЕВОД
Русский перевод этой страницы руководства разработал aereiae <aereiae@gmail.com>, Alexey <a.chepugov@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Max Is <ismax799@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Малянов Евгений Викторович <maljanow@outlook.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику по его адресу электронной почты или по адресу списка рассылки русских переводчиков.
2 мая 2024 г. | Linux man-pages 6.8 |