mq_timedsend(), mq_timedsend_monotonic()

Updated: April 19, 2023

Send a message to a message queue

Synopsis:

#include <mqueue.h>
#include <time.h>

int mq_timedsend( mqd_t mqdes, 
                  const char * msg_ptr, 
                  size_t msg_len, 
                  unsigned int msg_prio,
                  const struct timespec * abs_timeout );

int mq_timedsend_monotonic(
                  mqd_t mqdes, 
                  const char * msg_ptr, 
                  size_t msg_len, 
                  unsigned int msg_prio,
                  const struct timespec * abs_timeout );

Arguments:

mqdes
The descriptor of the message queue you want to put the message into, returned by mq_open().
msg_ptr
A pointer to the message data.
msg_len
The size of the buffer, in bytes.
msg_prio
The priority of the message, in the range from 0 through (MQ_PRIO_MAX - 1).
abs_timeout
A pointer to a timespec structure that specifies the absolute time (not the relative time to the current time) to wait before the function stops trying to send messages.

Library:

Description:

The mq_timedsend() function puts a message of size msg_len and pointed to by msg_ptr into the queue indicated by mqdes. The new message has a priority of msg_prio. The mq_timedsend_monotonic() function is a QNX Neutrino extension; it's similar to mq_timedsend(), but it uses CLOCK_MONOTONIC, so the timeout isn't affected by changes to the system time.

If you want to choose the clock against which the timeout is measured, you can instead use mq_clocksend(), which is similar to mq_timedsend() and mq_timedsend_monotonic() and differs only because of its clock parameter (clk). Choosing the clock prevents the timeout from being affected by changes to the system time.

Note: The message queue manager needs to be running. QNX Neutrino supports two implementations of message queues: a traditional implementation, and an alternate one that uses the mq server and a queue in kernel space. For more information, see the entries for mq and mqueue in the Utilities Reference, as well as the POSIX Message Queues: Two Implementations technote.

The queue maintained is in priority order, and in FIFO order within the same priority.

If the number of elements on the specified queue is equal to its mq_maxmsg, and O_NONBLOCK wasn't set (in the oflag argument to mq_open()), the call to mq_timedsend() blocks. It becomes unblocked when there's room on the queue to send the given message. If more than one mq_timedsend() is blocked on a given queue, and space becomes available in that queue to send, then the mq_timedsend() with the highest priority message is unblocked.

Returns:

-1 if an error occurred (errno is set). Any other value indicates success.

Errors:

EAGAIN
The O_NONBLOCK flag was set when opening the queue, and the specified queue is full.
EBADF
The mqdes argument doesn't represent a valid message queue descriptor, or mqdes isn't opened for writing.
EINTR
The call was interrupted by a signal.
EINVAL
One of the following is true:
  • The value of msg_prio is greater than (MQ_PRIO_MAX - 1).
  • The process or thread would have blocked, and the abs_timeout parameter specified a nanoseconds field value less than zero or greater than or equal to 1000 million.
EMSGSIZE
The msg_len argument is greater than the msgsize associated with the specified queue.
ETIMEDOUT
The timeout value was exceeded.

Examples:

See the example for mq_open().

Classification:

mq_timedsend() is POSIX 1003.1; mq_timedsend_monotonic() is QNX Neutrino

Safety:  
Cancellation point Yes
Interrupt handler No
Signal handler Yes
Thread Yes