[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Операции - очереди сообщений - msgrcv(2)

msgrcv - получить сообщение
msgid определяет очередь, из которой будет получено сообщение. msgp
указывает на область памяти, в которую сообщение будет записано. Эта
область памяти должна содержать long для типа сообщения, за которым
должен следовать буфер, достаточный для самого большого сообщения,
которое процесс хотел бы получить.
msgsz показывает максимальный размер сообщения, которое процесс хотел
бы получить. Это значение должно быть меньше или равно размера буфера,
который следует за long.
msgflg может иметь установленными биты IPC_NOWAIT и MSG_NOERROR.
Параметр msgtyp задает тип сообщения, которое нужно получить. Он может
принимать следующие значения:
  0   Будет получено первое сообщение в очереди.

  n   Будет получено первое сообщение типа n.

 -n   Первое сообщение  наименьшего типа,  находящееся  в  очереди,  с
      типами в диапазоне от 1 до абсолютного значения n.

Как правило, процесс будет приостановлен, если в очереди нет сообщений
заданного типа. Процесс будет приостановлен , пока либо в очереди не
появится требуемое сообщение, либо не будет перехвачен сигнал, либо
очередь не будет удалена. Если такая приостановка нежелательна, в
msgflg нужно установить IPC_NOWAIT.
msgsz - максимальное количеcтво байтов, которое может быть получено.
Количество, которое будет в действительности получено, зависит от
msgsz и msgflg. Предположим, что size_sent - это число байтов в
сообщении, посланном вызовом msgsnd(2). Если size_sent <= msgsz (т.е.,
если было послано меньше, чем максимум,заданный получателем), будет
получено size_sent байтов. Если size_sent > msgsz, посланное сообщение
больше, чем получатель хотел бы. Возникнет ошибка или нет,
определяется значением msgflg. Если установлен MSG_NOERROR, ошибки не
возникнет. Первые msgsz байтов будут получены, а остаток отброшен.
Если же флага MSG_NOERROR нет, msgrcv(2) возвращает -1, если размер
сообщения больше, чем msgsz. В этом случае сообщение не будет
потеряно. Если получатель задаст MSG_NOERROR в следующем обращении к
msgrcv(2), или использует больший буфер, возможно, выделенный
malloc(2), то сообщение может быть прочитано.
В случае успеха, msgrcv(2) возвращает количество прочитанных байтов.
Этот вызов не имеет средств для определения id процесса или id
пользователя посылающего процесса. Эту информацию можно передавать в
теле сообщения, или даже в типе, если он не используется для других
целей.
                     ОПЕРАЦИИ - ОЧЕРЕДИ СООБЩЕНИЙ
                              msgrcv(2)

ИМЯ

    msgop - операции над очередями

ИСПОЛЬЗОВАНИЕ

    #include   <sys/types.h>
    #include   <sys/ipc.h>
    #include   <sys/msg.h>

    int msgsnd (int msg id, const struct msgbuf *msgp,
               int msgsz, int msgflg);
+   int msgrcv (int msg id, const struct msgbuf *msgp,
               int msgsz, long msgtyp, int msgflg);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

    msgsnd     успех      - 0

    msgrcv     успех      - количество прочитанных байтов
               неуспех   - -1 и errno установлена