Книга: Основы программирования в Linux
msgrcv
msgrcv
Функция msgrcv
извлекает сообщения из очереди сообщений:
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
Первый параметр msqid
— идентификатор очереди сообщений, возвращенный функцией msgget.
Второй параметр msg_ptr
— указатель на получаемое сообщение, которое должно начинаться с элемента типа long int
, как описывалось ранее в функции msgsnd
.
Третий параметр msg_sz
— размер сообщения, на которое указывает msg_ptr
, без элемента типа long int
, содержащего тип сообщения.
Четвертый параметр msgtype
типа long int
позволяет реализовать простую форму приоритетного получения. Если значение msgtype
равно 0, извлекается первое доступное сообщение в очереди. Если значение параметра больше нуля, извлекается первое сообщение с таким же типом сообщения. Если оно меньше нуля, извлекается первое сообщение с таким же типом сообщения или со значением, по абсолютной величине меньшим, чем msgtype
.
На практике все гораздо проще. Если вы просто хотите получать сообщения в порядке их отправления, задайте msgtype
, равным 0. Если нужно извлекать сообщения только с определенным типом, задайте msgtype
, равным этому значению. Если вам необходимо получать сообщения с типом не превышающим n, задайте msgtype
, равным -n
.
Четвертый параметр msgflg
управляет действиями в случае отсутствия сообщения подходящего типа, которое ожидает извлечения. Если в параметре msgflg
установлен флаг IPC_NOWAIT
, вызов вернет управление программе немедленно с возвращаемым значением -1. Если флаг IPC_NOWAIT
в msgflg
сброшен, процесс будет приостановлен в ожидании прибытия сообщения подходящего типа.
В случае успешного завершения функция msgrcv вернет количество байтов, помещенных в буфер приема, сообщение копируется в выделяемый пользователем буфер, на который указывает msg_ptr
, и данные удаляются из очереди сообщений. В случае ошибки функция вернет -1.