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 специфицирует действия, предпринимаемые, если выполнено хотя бы одно из следующих условий:

  1. Текущее количество байт в очереди уже равно значению поля msg_qbytes ассоциированной структуры данных [см. intro(2)].
  2. Общее количество сообщений во всех очередях системы равно максимально допустимому системой.
Действия, специфицируемые аргументом msgflg, следующие:
  1. Если выражение (msgflg & IPC_NOWAIT) истинно, то сообщение не посылается и вызывающему процессу сразу же возвращается управление.
  2. Если выражение (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)]:

  1. Значение поля msg_qnum увеличивается на 1.
  2. Значение поля msg_lspid устанавливается равным идентификатору (номеру) вызывающего процесса.
  3. Значение поля msg_stime устанавливается равным текущему времени.

Прием сообщения
Системный вызов msgrcv получает сообщение из очереди, ассоциированной с идентификатором очереди msqid, и помещает его в структуру, на которую указывает аргумент msgp. {Требуется право на чтение.} Эта структура состоит из следующих полей:


    long mtype;    /* Тип сообщения */

    char mtext []; /* Текст сообщения */

Поле mtype содержит тип получаемого сообщения, который специфицируется посылающим процессом. Поле mtext содержит текст сообщения. Значение аргумента msgsz определяет размер текста в байтах. Получаемое сообщение обрезается до msgsz байт, если его длина превышает msgsz и выражение (msgflg & MSG_NOERROR) истинно. Отброшенная часть сообщения пропадает и вызывающий процесс не получает никакого уведомления об обрезании.

Аргумент msgtyp специфицирует тип запрашиваемого сообщения в соответствии со следующими соглашениями:

  1. Если значение msgtyp равно 0, требуется первое сообщение в очереди.
  2. Если значение msgtyp больше 0, требуется первое сообщение типа msgtyp.
  3. Если значение msgtyp меньше 0, требуется первое сообщение наименьшего из типов, которые меньше или равны абсолютной величине аргумента msgtyp.

Аргумент msgflg специфицирует действия, предпринимаемые в том случае, если в очереди нет сообщения нужного типа. Эти действия следующие:

  1. Если выражение (msgflg & IPC_NOWAIT) истинно, то вызывающий процесс сразу же получает управление, ему возвращается -1 и errno присваивается значение ENOMSG.
  2. Если выражение (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)]:

  1. Значение поля msg_qnum уменьшается на 1.
  2. Значение поля msg_lrpid устанавливается равным идентификатору (номеру) вызывающего процесса.
  3. Значение поля msg_rtime устанавливается равным текущему времени.

СМ. ТАКЖЕ
intro(2), msgctl(2), msget(2), signal(2).

ДИАГНОСТИКА
Если описанные выше системные вызовы завершаются неудачей из-за получения сигнала, то вызывающему процессу возвращается -1, а переменной errno присваивается значение EINTR. Если системные вызовы завершаются неудачей из-за удаления из системы идентификатора очереди msqid, то возвращается -1 и errno присваивается значение EIDRM.

При успешном завершении системных вызовов возвращаются следующие значения:

  1. Msgsnd возвращает 0.
  2. Msgrcv возвращает значение, равное количеству байт, действительно помещенных в поле mtext.

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