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 ассоциированной структуры данных [см. intro(2)].
- Общее количество сообщений во всех очередях системы равно максимально допустимому системой.
Действия, специфицируемые аргументом msgflg, следующие:
- Если выражение (msgflg & IPC_NOWAIT) истинно, то
сообщение не посылается и вызывающему процессу
сразу же возвращается управление.
- Если выражение (msgflg & IPC_NOWAIT) ложно, то выполнение вызывающего процесса задерживается до тех
пор, пока не произойдет одно из следующих событий:
- Условие, определяющее задержку процесса, перестает существовать; в этом случае посылается сообщение.
- Идентификатор очереди сообщений msqid удаляется из системы [см. msgctl(2)]; в этом случае errno присваивается значение EIDRM и в
качестве результата возвращается -1.
- Вызывающий процесс получает сигнал, который
должен быть обработан; в этом случае сообщение не посылается и вызывающий процесс продолжает выполнение так, как описано в
signal(2).
Системный вызов msgsnd завершается неудачей и сообщение
не посылается, если выполнено хотя бы одно из следующих
условий:
- [EINVAL]
- Идентификатор очереди сообщений msqid не
является корректным.
- [EACCES]
- У вызывающего процесса нет прав на выполнение операции [см. intro(2)].
- [EINVAL]
- Значение поля mtype меньше 1.
- [EAGAIN]
- Сообщение не может быть послано по какой
либо из описанных выше причин, и выражение
(msgflg & IPC_NOWAIT) истинно.
- [EINVAL]
- Значение аргумента msgsz меньше 0 или больше максимально допустимого в системе.
- [EFAULT]
- Аргумент msgp указывает за пределы отведенного процессу адресного пространства.
При успешном выполнении вызова над структурой данных,
ассоциированной с идентификатором msqid, производятся
следующие действия [см. intro(2)]:
- Значение поля 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.
- Вызывающий процесс получает сигнал, который
должен быть обработан; в этом случае получения сообщения не происходит и вызывающий процесс возобновляет выполнение так, как описано
в signal(2).
Системный вызов msgrcv завершается неудачей и сообщение
не принимается, если выполнено хотя бы одно из следующих условий:
- [EINVAL]
- Значение аргумента msgid не является корректным идентификатором очереди сообщений.
- [EACCES]
- У вызывающего процесса нет прав на выполнение операции.
- [EINVAL]
- Значение аргумента msgsz меньше 0.
- [E2BIG]
- Размер сообщения больше msgsz и выражение
(msgflg & MSG_NOERROR) ложно.
- [ENOMSG]
- Очередь не содержит сообщения нужного типа
и выражение (msgflg & IPC_NOWAIT) истинно.
- [EFAULT]
- Аргумент msgp указывает за пределы отведенного процессу адресного пространства.
При успешном выполнении вызова над структурой данных,
ассоциированной с идентификатором msqid, производятся
следующие действия [см. intro(2)]:
- Значение поля msg_qnum уменьшается на 1.
- Значение поля msg_lrpid устанавливается равным
идентификатору (номеру) вызывающего процесса.
- Значение поля msg_rtime устанавливается равным текущему времени.
СМ. ТАКЖЕ
intro(2), msgctl(2), msget(2), signal(2).
ДИАГНОСТИКА
Если описанные выше системные вызовы завершаются неудачей из-за получения сигнала, то вызывающему процессу
возвращается -1, а переменной errno присваивается значение EINTR. Если системные вызовы завершаются неудачей
из-за удаления из системы идентификатора очереди msqid,
то возвращается -1 и errno присваивается значение
EIDRM.
При успешном завершении системных вызовов возвращаются
следующие значения:
- Msgsnd возвращает 0.
- Msgrcv возвращает значение, равное количеству
байт, действительно помещенных в поле mtext.
В иных случаях возвращается -1, а переменной errno
присваивается код ошибки.