a message from a message queue
() function receives a message from the
message queue specified in msqid
, and places
it into the structure pointed to by msgp
This structure should consist of the following members:
long mtype; /* message type */
char mtext; /* body of message */
is an integer greater than 0 that can be
used for selecting messages, mtext
array of bytes, with a size up to that of the system limit
The value of msgtyp
has one of the following
- msgtyp is greater than
0. The first message of type msgtyp will
- msgtyp is equal to 0.
The first message on the queue will be received.
- msgtyp is less than 0.
The first message of the lowest message type that is less than or equal to
the absolute value of msgtyp will be
specifies the maximum length of the
requested message. If the received message has a length greater than
it will be silently truncated if the
flag is set in
, otherwise an error will be returned.
If no matching message is present on the message queue specified by
, the behavior of
() depends on whether the
flag is set in
or not. If
() will immediately return a value of -1,
and set errno
is not set, the calling process
will be blocked until:
- A message of the requested type becomes available on the
- The message queue is removed, in which case -1 will be
returned, and errno set to
- A signal is received and caught. -1 is returned, and
errno set to
If a message is successfully received, the data structure associated with
is updated as follows:
- msg_cbytes is
decremented by the size of the message.
- msg_lrpid is set to the
pid of the caller.
- msg_lrtime is set to
the current time.
- msg_qnum is decremented
Upon successful completion, msgrcv
() returns the
number of bytes received into the mtext
of the structure pointed to by msgp
Otherwise, -1 is returned, and errno
indicate the error.
() will fail if:
- msqid is not a valid
message queue identifier.
msgsz is less than 0.
- A matching message was received, but its size was greater
than msgsz and the
MSG_NOERROR flag was not set in
- The calling process does not have read access to the
- msgp points to an invalid
- The system call was interrupted by the delivery of a
- There is no message of the requested type available on the
message queue, and
IPC_NOWAIT is set in
- The message queue was removed while
msgrcv() was waiting for a message of the
requested type to become available on it.
Message queues appeared in AT&T System V
Release 1 UNIX