Receive a message from a message queue
#include <mqueue.h> #include <time.h> ssize_t mq_timedreceive( mqd_t mqdes, char * msg_ptr, size_t msg_len, unsigned int * msg_prio, const struct timespec * abs_timeout ); ssize_t mq_timedreceive_monotonic( mqd_t mqdes, char * msg_ptr, size_t msg_len, unsigned int * msg_prio, const struct timespec * abs_timeout );
Use the -l c option to qcc to link against this library. This library is usually included automatically.
Use the -l mq option to qcc to link against this library.
The mq_timedreceive() function receives the oldest of the highest priority messages in the queue specified by mqdes. The mq_timedreceive_monotonic() function is a QNX Neutrino extension; it's similar to mq_timedreceive(), but it uses CLOCK_MONOTONIC, so the timeout isn't affected by changes to the system time.
Neutrino supports two implementations of message queues: a traditional implementation, and an alternate one that uses asynchronous messages. For more information, see the entries for mq and mqueue in the Utilities Reference, as well as the Managing POSIX Message Queues technote. |
If you call mq_timedreceive() with a msg_len of anything other than the mq_msgsize of the specified queue, then mq_timedreceive() returns an error, and errno is set to EINVAL.
If there are no messages on the queue specified, and O_NONBLOCK wasn't set (in the oflag argument to mq_open()), then the mq_timedreceive() call blocks. If multiple mq_timedreceive() calls are blocked on a single queue, then they're unblocked in FIFO order as messages arrive.
In the traditional (mqueue) implementation, calling read() with mqdes is analogous to calling mq_timedreceive() with a NULL msg_prio.
The size of the message removed from the queue, or -1 if an error occurred (no message is removed from the queue, and errno is set).
Specify an absolute timeout of 1 second:
struct timespec tm; clock_gettime(CLOCK_REALTIME, &tm); tm.tv_sec += 1; if( 0 > mq_timedreceive( fd, buf, 4096, NULL, &tm ) ) { ... }
mq_timedreceive() is POSIX 1003.1 MSG; mq_timedreceive_monotonic() is QNX Neutrino
Safety: | |
---|---|
Cancellation point | Yes |
Interrupt handler | No |
Signal handler | Yes |
Thread | Yes |
mq_close(), mq_open(), mq_receive(), mq_send(), mq_timedsend(), timespec
mq, mqueue in the Utilities Reference
Managing POSIX Message Queues technote.