NAME
mq_receive, mq_timedreceive - receive a message from a message queue
SYNOPSIS
#include <mqueue.h>
I ssize_t mq_receive(mqd_t mqdes , char * msg_ptr ,
I size_t msg_len , unsigned * msg_prio );
#define _XOPEN_SOURCE 600
#include <time.h>
#include <mqueue.h>
I ssize_t mq_timedreceive(mqd_t mqdes , char * msg_ptr ,
I size_t msg_len , unsigned * msg_prio ,
I const struct timespec * abs_timeout );
DESCRIPTION
R mq_receive ()
removes the oldest message with the highest priority from
the message queue referred to by the descriptor
R mqdes ,
and places it in the buffer pointed to by
R msg_ptr .
The
msg_len
argument specifies the size of the buffer pointed to by
R msg_ptr ;
this must be greater than the
mq_msgsize
attribute of the queue (see
mq_getattr(3)).
If
prio
is not NULL, then the buffer to which it points is used
to return the priority associated with the received message.
If the queue is empty, then, by default,
R mq_receive ()
blocks until a message becomes available,
or the call is interrupted by a signal handler.
If the
O_NONBLOCK
flag is enabled for the message queue description,
then the call instead fails immediately with the error
R EAGAIN .
R mq_timedreceive ()
behaves just like
R mq_receive (),
except that if the queue is empty and the
O_NONBLOCK
flag is not enabled for the message queue description, then
abs_timeout
points to a structure which specifies a ceiling on the time for which
the call will block.
This ceiling is an absolute timeout in seconds and nanoseconds
since the Epoch (midnight on the morning of 1 January 1970),
specified in the following structure:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
If no message is available,
and the timeout has already expired by the time of the call,
R mq_timedreceive ()
returns immediately.
RETURN VALUE
On success,
R mq_receive ()
and
R mq_timedreceive ()
return the number of bytes in the received message;
on error, -1 is returned, with
errno
set to indicate the error.
ERRORS
EAGAIN
The queue was empty, and the
O_NONBLOCK
flag was set for the message queue description referred to by
R mqdes .
EBADF
The descriptor specified in
mqdes
was invalid.
EMSGSIZE
R msg_len
was less than the
mq_msgsize
attribute of the message queue.
EINTR
The call was interrupted by a signal handler.
EINVAL
The call would have blocked, and
abs_timeout
was invalid, either because
tv_sec
was less than zero, or because
tv_nsec
was less than zero or greater than 1000 million.
ETIMEDOUT
The call timed out before a message could be transferred.
CONFORMING TO
POSIX.1-2001.
SEE ALSO