MSGOP(2)
MSGOP(2)
НАЗВАНИЕ
msgop - операции над очередью сообщений
СИНТАКСИС
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>
int msgsnd (msqid, msgp, msgsz, msgflg) int msqid; struct msgbuf *msgp; int msgsz, msgflg;
int msgrcv (msqid, msgp, msgsz, msgtyp, msgflg) int msqid; struct msgbuf *msgp; long msgtyp; int msgsz, msgflg;
ОПИСАНИЕ
Посылка сообщения
Системный вызов msgsnd используется для того, чтобы поместить сообщение в очередь, ассоциированную с идентификатором очереди msqid. {Требуется право на запись.} Аргумент msgp является указателем на структуру, содержащую сообщение. Структура содержит следующие поля:
long mtype; /* Тип сообщения */ char mtext []; /* Текст сообщения */
Поле mtype содержит положительное целое число, которое может использоваться процессом-получателем для выбора сообщений (см. ниже описание системного вызова msgrcv). Поле mtext содержит текст длиной msgsz байт. Аргумент msgsz может принимать значения от 0 до установленного системой лимита.
Аргумент msgflg специфицирует действия, предпринимаемые, если выполнено хотя бы одно из следующих условий:
- Текущее количество байт в очереди уже равно значению поля msg_qbytes ассоциированной структуры данных [см. ].
- Общее количество сообщений во всех очередях системы равно максимально допустимому системой.
Действия, специфицируемые аргументом msgflg, следующие:
- Если выражение (msgflg & IPC_NOWAIT) истинно, то сообщение не посылается и вызывающему процессу сразу же возвращается управление.
- Если выражение (msgflg & IPC_NOWAIT) ложно, то выполнение вызывающего процесса задерживается до тех пор, пока не произойдет одно из следующих событий:
- Условие, определяющее задержку процесса, перестает существовать; в этом случае посылается сообщение.
- Идентификатор очереди сообщений msqid удаляется из системы [см. ]; в этом случае errno присваивается значение EIDRM и в качестве результата возвращается -1.
- Вызывающий процесс получает сигнал, который должен быть обработан; в этом случае сообщение не посылается и вызывающий процесс продолжает выполнение так, как описано в .
Системный вызов msgsnd завершается неудачей и сообщение не посылается, если выполнено хотя бы одно из следующих условий:
[EINVAL] Идентификатор очереди сообщений msqid не является корректным. [EACCES] У вызывающего процесса нет прав на выполнение операции [см. ]. [EINVAL] Значение поля mtype меньше 1. [EAGAIN] Сообщение не может быть послано по какой либо из описанных выше причин, и выражение (msgflg & IPC_NOWAIT) истинно. [EINVAL] Значение аргумента msgsz меньше 0 или больше максимально допустимого в системе. [EFAULT] Аргумент msgp указывает за пределы отведенного процессу адресного пространства.
При успешном выполнении вызова над структурой данных, ассоциированной с идентификатором msqid, производятся следующие действия [см. ]:
- Значение поля msg_qnum увеличивается на 1.
- Значение поля msg_lspid устанавливается равным идентификатору (номеру) вызывающего процесса.
- Значение поля msg_stime устанавливается равным текущему времени.
Прием сообщения
Системный вызов msgrcv получает сообщение из очереди, ассоциированной с идентификатором очереди msqid, и помещает его в структуру, на которую указывает аргумент msgp. {Требуется право на чтение.} Эта структура состоит из следующих полей:
long mtype; /* Тип сообщения */ char mtext []; /* Текст сообщения */
Поле mtype содержит тип получаемого сообщения, который специфицируется посылающим процессом. Поле mtext содержит текст сообщения. Значение аргумента msgsz определяет размер текста в байтах. Получаемое сообщение обрезается до msgsz байт, если его длина превышает msgsz и выражение (msgflg & MSG_NOERROR) истинно. Отброшенная часть сообщения пропадает и вызывающий процесс не получает никакого уведомления об обрезании.
Аргумент msgtyp специфицирует тип запрашиваемого сообщения в соответствии со следующими соглашениями:
- Если значение msgtyp равно 0, требуется первое сообщение в очереди.
- Если значение msgtyp больше 0, требуется первое сообщение типа msgtyp.
- Если значение msgtyp меньше 0, требуется первое сообщение наименьшего из типов, которые меньше или равны абсолютной величине аргумента msgtyp.
Аргумент msgflg специфицирует действия, предпринимаемые в том случае, если в очереди нет сообщения нужного типа. Эти действия следующие:
- Если выражение (msgflg & IPC_NOWAIT) истинно, то вызывающий процесс сразу же получает управление, ему возвращается -1 и errno присваивается значение ENOMSG.
- Если выражение (msgflg & IPC_NOWAIT) ложно, то выполнение вызывающего процесса приостанавливается до тех пор, пока не произойдет одно из следующих событий:
- В очереди появляется сообщение нужного типа.
- Идентификатор очереди сообщений удаляется из системы; в этом случае возвращается -1 и errno присваивается значение EIDRM.
- Вызывающий процесс получает сигнал, который должен быть обработан; в этом случае получения сообщения не происходит и вызывающий процесс возобновляет выполнение так, как описано в .
Системный вызов msgrcv завершается неудачей и сообщение не принимается, если выполнено хотя бы одно из следующих условий:
[EINVAL] Значение аргумента msgid не является корректным идентификатором очереди сообщений. [EACCES] У вызывающего процесса нет прав на выполнение операции. [EINVAL] Значение аргумента msgsz меньше 0. [E2BIG] Размер сообщения больше msgsz и выражение (msgflg & MSG_NOERROR) ложно. [ENOMSG] Очередь не содержит сообщения нужного типа и выражение (msgflg & IPC_NOWAIT) истинно. [EFAULT] Аргумент msgp указывает за пределы отведенного процессу адресного пространства.
При успешном выполнении вызова над структурой данных, ассоциированной с идентификатором msqid, производятся следующие действия [см. ]:
- Значение поля msg_qnum уменьшается на 1.
- Значение поля msg_lrpid устанавливается равным идентификатору (номеру) вызывающего процесса.
- Значение поля msg_rtime устанавливается равным текущему времени.
СМ. ТАКЖЕ
, , msget(2), .
ДИАГНОСТИКА
Если описанные выше системные вызовы завершаются неудачей из-за получения сигнала, то вызывающему процессу возвращается -1, а переменной errno присваивается значение EINTR. Если системные вызовы завершаются неудачей из-за удаления из системы идентификатора очереди msqid, то возвращается -1 и errno присваивается значение EIDRM.
При успешном завершении системных вызовов возвращаются следующие значения:
- Msgsnd возвращает 0.
- Msgrcv возвращает значение, равное количеству байт, действительно помещенных в поле mtext.
В иных случаях возвращается -1, а переменной errno присваивается код ошибки.