26.5.4. Получение сообщений очереди

26.5.4. Получение сообщений очереди

Для получения сообщения используется системный вызов msgrcv():

int msgrcv(int msqid, struct msgbuf *msgp, int msgsz,

 long mtype, int msgflg);

Первый аргумент определяет очередь, из которой нужно получить сообщение. Второй аргумент — это адрес буфера, в который будет записано сообщение. Третий аргумент — это ограничитель длины сообщения. Четвертый аргумент — это тип сообщения. Ядро будет искать в очереди наиболее старое сообщение данного типа и вернет его копию. Если mtype=0, то ядро вернет самое старое сообщение независимо от типа.

После успешного получения сообщения оно удаляется из очереди.

В случае успеха вызов msqrcv() возвращает число байтов, скопированных в буфер, или -1 в случае ошибки. Переменная errno устанавливается следующим образом:

? E2BIG — длина сообщения больше, чем ограничитель msgsz;

? EACCESS — у вас недостаточно прав;

? EFAULT — недоступен адрес буфера;

? EIDRM — очередь уничтожена ядром;

? EINTR — операция прервана поступившим сигналом;

? EINVAL — ошибка в аргументах, например, отрицательный размер сообщения или неверный номер очереди;

? ENOMSG — нет сообщения, удовлетворяющего условию. Посылается, если установлен флаг IPC_NOWAIT, в противном случае процесс будет ждать нужного сообщения.

Последний аргумент предоставляет дополнительные возможности по работе с сообщениями. Если установлен бит MSG_NOERROR в msgflg, то если размер сообщения больше, чем msgsz, оно будет обрезано и вы получите только msgsz байтов. Если флаг MSG_NOERROR не устанавливать, вы получите ошибку E2BIG.

Следующий код получает сообщение из очереди:

int id; /* ID очереди */

int res, length; /* результат операции и длина */

struct my_buf buf; /* буфер */

int type = 1; /* тип сообщения */

length = sizeof(struct my_buf) — sizeof(long);

if ((res =

 msgrcv(id, &buf, length, type, 0)) == -1) {

 printf("Ошибка!");

 /* можно проанализировать ошибку */

 if (errno==E2BIG) printf("Сообщение слишком большое ");

 if (errno==EACCESS) printf("Heт доступа ");

 /* и т.д. */

 exit(1);

}

Данный текст является ознакомительным фрагментом.



Поделитесь на страничке

Похожие главы из других книг:

Получение сообщений об изменении транспортной MTU

Из книги автора

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


26.5. Очереди сообщений

Из книги автора

26.5. Очереди сообщений 26.5.1. Основные структуры ядра для работы с очередями Очередь сообщений — это связный список, находящийся в адресном пространстве ядра. Каждая очередь имеет свой уникальный идентификатор IPC.Структура ядра msgbuf (описана в файле /usr/src/linux/include/linux/msg.h)


5.4.4. Получение подписанных или зашифрованных сообщений

Из книги автора

5.4.4. Получение подписанных или зашифрованных сообщений Представим, что вы получили подписанное кем-то сообщение. Вы хотите проверить, верна ли цифровая подпись. Щелкните на письме в списке писем двойным щелчком. Откроется окно просмотра письма, в нем из пункта


ГЛАВА 5 Очереди сообщений Posix

Из книги автора

ГЛАВА 5 Очереди сообщений Posix 5.1. Введение Очередь сообщений можно рассматривать как связный список сообщений. Программные потоки с соответствующими разрешениями могут помещать сообщения в очередь, а потоки с другими соответствующими разрешениями могут извлекать их


Пример: очереди сообщений Posix и функция select

Из книги автора

Пример: очереди сообщений Posix и функция select Дескриптор очереди сообщений (переменная типа mqd_t) не является «обычным» дескриптором и не может использоваться с функциями select и poll (глава 6 [24]). Тем не менее их можно использовать вместе с каналом и функцией mq_notify. (Аналогичный


ГЛАВА 6 Очереди сообщений System V

Из книги автора

ГЛАВА 6 Очереди сообщений System V 6.1. Введениеы Каждой очереди сообщений System V сопоставляется свой идентификатор очереди сообщений. Любой процесс с соответствующими привилегиями (раздел 3.5) может поместить сообщение в очередь, и любой процесс с другими соответствующими


6.10. Ограничения, накладываемые на очереди сообщений

Из книги автора

6.10. Ограничения, накладываемые на очереди сообщений Как отмечалось в разделе 3.8, на очереди сообщений часто накладываются системные oгрaничeния. В табл. 6.2 приведены значения этих oгрaничeний для двух конкретных реализаций. Первая колонка представляет собой традиционное


Измерение полосы пропускания очереди сообщений Posix

Из книги автора

Измерение полосы пропускания очереди сообщений Posix В листинге А.5 приведена функция main программы, измеряющей полосу пропускания очереди сообщений Posix. Листинг А.6 содержит функции reader и writer. Эта программа устроена аналогично предыдущей, измерявшей полосу пропускания


Получение и пересылка сообщений. Создание ответных сообщений

Из книги автора

Получение и пересылка сообщений. Создание ответных сообщений Чтобы получить новую почту, выполните команду главного меню Сервис ? Отправить/Получить ? Доставить почту либо нажмите клавишу F9. Все полученные почтовые сообщения будут помещены в папку Входящие и помечены


Сообщения и очереди сообщений

Из книги автора

Сообщения и очереди сообщений GetQueueStatus Функция GetQueueStatus возвращает флаги, которые показывают тип сообщений, обнаруженных в очереди сообщений вызывающего потока. DWORD GetQueueStatus ( UINT flags // флаги состояния очереди ); Параметры flags - определяет флаги состояния очереди, указывая


У6.10 Очереди

Из книги автора

У6.10 Очереди Описать в виде АТД очереди (первым пришел - первым ушел) в том же стиле, что и стеки. Обратите внимание на общие и отличительные черты этих АТД. (Указание: аксиомы для item и remove должны отличаться, при описании put (s,x) рассмотрите случаи, когда очередь s пуста и