NAME
mq_send,
mq_timedsend —
send a message to a message queue (REALTIME)
LIBRARY
POSIX Real-time Library (librt, -lrt)
SYNOPSIS
#include <mqueue.h>
int
mq_send(
mqd_t mqdes,
const char *msg_ptr,
size_t
msg_len,
unsigned msg_prio);
#include <mqueue.h>
#include <time.h>
int
mq_timedsend(
mqd_t mqdes,
const char *msg_ptr,
size_t
msg_len,
unsigned msg_prio,
const
struct timespec *abs_timeout);
DESCRIPTION
The
mq_send() function will add the message pointed to by the
argument
msg_ptr to the message queue specified by
mqdes. The
msg_len argument
specifies the length of the message, in bytes, pointed to by
msg_ptr. The value of
msg_len will
be less than or equal to the
mq_msgsize attribute of the
message queue, or
mq_send() will fail.
If the specified message queue is not full,
mq_send() behaves
as if the message is inserted into the message queue at the position indicated
by the
msg_prio argument. A message with a larger
numeric value of
msg_prio will be inserted before
messages with lower values of
msg_prio. A message will
be inserted after other messages in the queue, if any, with equal
msg_prio. The value of
msg_prio
will be less than {
MQ_PRIO_MAX
}.
If the specified message queue is full and
O_NONBLOCK
is
not set in the message queue description associated with
mqdes,
mq_send() blocks until space
becomes available to enqueue the message, or until
mq_send()
is interrupted by a signal. If more than one thread is waiting to send when
space becomes available in the message queue, then the thread of the highest
priority that has been waiting the longest will be unblocked to send its
message. If the specified message queue is full and
O_NONBLOCK
is set in the message queue description
associated with
mqdes, the message will not be queued
and
mq_send() will return an error.
The
mq_timedsend() function will add a message to the message
queue specified by
mqdes in the manner defined for the
mq_send() function. However, if the specified message queue
is full and
O_NONBLOCK
is not set in the message queue
description associated with
mqdes, the wait for
sufficient room in the queue will be terminated when the specified timeout
expires. If
O_NONBLOCK
is set in the message queue
description, this function will be equivalent to
mq_send().
The timeout will expire when the absolute time specified by
abs_timeout passes, as measured by the clock on which
timeouts are based (that is, when the value of that clock equals or exceeds
abs_timeout), or if the absolute time specified by
abs_timeout has already been passed at the time of the
call.
The resolution of the timeout is based on the CLOCK_REALTIME clock. The
timespec argument is defined in the
<time.h> header.
Under no circumstance will the operation fail with a timeout if there is
sufficient room in the queue to add the message immediately. The validity of
the
abs_timeout parameter need not be checked when there
is sufficient room in the queue.
RETURN VALUES
Upon successful completion, the
mq_send() and
mq_timedsend() functions return a value of zero. Otherwise,
no message will be enqueued, the functions will return -1, and the global
variable
errno will be set to indicate the error.
ERRORS
The
mq_send() and
mq_timedsend() functions
fail if:
-
-
- [
EAGAIN
]
- The
O_NONBLOCK
flag is set in the
message queue description associated with mqdes, and
the specified message queue is full.
-
-
- [
EBADF
]
- The mqdes argument is not a valid
message queue descriptor open for writing.
-
-
- [
EINTR
]
- A signal interrupted the call to
mq_send() or mq_timedsend().
-
-
- [
EINVAL
]
- The value of msg_prio was outside the
valid range, or 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 specified message length,
msg_len, exceeds the message size attribute of the
message queue.
-
-
- [
ETIMEDOUT
]
- The
O_NONBLOCK
flag was not set
when the message queue was opened, but the timeout expired before the
message could be added to the queue.
SEE ALSO
mq(3),
mq_receive(3)
STANDARDS
These functions are expected to conform to the
IEEE Std
1003.1-2001 (“POSIX.1”) standard.
HISTORY
The
mq_send() and
mq_timedsend() functions
first appeared in
NetBSD 5.0.
COPYRIGHT
Portions of this text are reprinted and reproduced in electronic form from IEEE
Std 1003.1, 2003 Edition, Standard for Information Technology -- Portable
Operating System Interface (POSIX), The Open Group Base Specifications Issue
6, Copyright (C) 2001-2003 by the Institute of Electrical and Electronics
Engineers, Inc and The Open Group. In the event of any discrepancy between
this version and the original IEEE and The Open Group Standard, the original
IEEE and The Open Group Standard is the referee document. The original
Standard can be obtained online at
http://www.opengroup.org/unix/online.html.