Добавить в цитаты Настройки чтения

Страница 258 из 324

На практике все гораздо проще. Если вы просто хотите получать сообщения в порядке их отправления, задайте msgtype, равным 0. Если нужно извлекать сообщения только с определенным типом, задайте msgtype, равным этому значению. Если вам необходимо получать сообщения с типом не превышающим n, задайте msgtype, равным -n.

Четвертый параметр msgflg управляет действиями в случае отсутствия сообщения подходящего типа, которое ожидает извлечения. Если в параметре msgflg установлен флаг IPC_NOWAIT, вызов вернет управление программе немедленно с возвращаемым значением -1. Если флаг IPC_NOWAIT в msgflg сброшен, процесс будет приостановлен в ожидании прибытия сообщения подходящего типа.

В случае успешного завершения функция msgrcv вернет количество байтов, помещенных в буфер приема, сообщение копируется в выделяемый пользователем буфер, на который указывает msg_ptr, и данные удаляются из очереди сообщений. В случае ошибки функция вернет -1.

msgctl

Последняя функция обработки очереди сообщений msgctl очень похожа на функцию управления для совместно используемой памяти:

int msgctl(int msqid; int command, struct msqid_ds *buf);

Структура msqid_ds содержит, как минимум, следующие элементы:

<b>struct msqid_ds {</b>

<b> uid_t msg_perm.uid;</b>

<b> uid_t msg_perm.gid;</b>

<b> mode_t msg_perm.mode;</b>

<b>}</b>

Первый параметр msqid — идентификатор, возвращаемый функцией msgget.

Второй параметр command задает предпринимаемое действие. Он может принимать три значения, перечисленные в табл. 14.3.

Таблица 14.3