Xenomai
3.1
|
Cobalt/POSIX message queue services. More...
Functions | |
mqd_t | mq_open (const char *name, int oflags,...) |
Open a message queue More... | |
int | mq_close (mqd_t mqd) |
Close a message queue More... | |
int | mq_unlink (const char *name) |
Unlink a message queue More... | |
int | mq_getattr (mqd_t mqd, struct mq_attr *attr) |
Get message queue attributes More... | |
int | mq_setattr (mqd_t mqd, const struct mq_attr *__restrict__ attr, struct mq_attr *__restrict__ oattr) |
Set message queue attributes More... | |
int | mq_send (mqd_t q, const char *buffer, size_t len, unsigned prio) |
Send a message to a message queue. More... | |
int | mq_timedsend (mqd_t q, const char *buffer, size_t len, unsigned prio, const struct timespec *timeout) |
Attempt, during a bounded time, to send a message to a message queue. More... | |
ssize_t | mq_receive (mqd_t q, char *buffer, size_t len, unsigned *prio) |
Receive a message from a message queue. More... | |
ssize_t | mq_timedreceive (mqd_t q, char *__restrict__ buffer, size_t len, unsigned *__restrict__ prio, const struct timespec *__restrict__ timeout) |
Attempt, during a bounded time, to receive a message from a message queue. More... | |
int | mq_notify (mqd_t mqd, const struct sigevent *evp) |
Enable notification on message arrival More... | |
Cobalt/POSIX message queue services.
A message queue allow exchanging data between real-time threads. For a POSIX message queue, maximum message length and maximum number of messages are fixed when it is created with mq_open().
int mq_close | ( | mqd_t | mqd | ) |
Close a message queue
This service closes the message queue descriptor mqd. The message queue is destroyed only when all open descriptors are closed, and when unlinked with a call to the mq_unlink() service.
mqd | message queue descriptor. |
0 | on success; |
-1 | with errno set if:
|
int mq_getattr | ( | mqd_t | mqd, |
struct mq_attr * | attr | ||
) |
Get message queue attributes
This service stores, at the address attr, the attributes of the messages queue descriptor mqd.
The following attributes are set:
mqd | message queue descriptor; |
attr | address where the message queue attributes will be stored on success. |
0 | on success; |
-1 | with errno set if:
|
int mq_notify | ( | mqd_t | mqd, |
const struct sigevent * | evp | ||
) |
Enable notification on message arrival
If evp is not NULL and is the address of a sigevent structure with the sigev_notify member set to SIGEV_SIGNAL, the current thread will be notified by a signal when a message is sent to the message queue mqd, the queue is empty, and no thread is blocked in call to mq_receive() or mq_timedreceive(). After the notification, the thread is unregistered.
If evp is NULL or the sigev_notify member is SIGEV_NONE, the current thread is unregistered.
Only one thread may be registered at a time.
If the current thread is not a Cobalt thread (created with pthread_create()), this service fails.
mqd | message queue descriptor; |
evp | pointer to an event notification structure. |
0 | on success; |
-1 | with errno set if:
|
mqd_t mq_open | ( | const char * | name, |
int | oflags, | ||
... | |||
) |
Open a message queue
This service opens the message queue named name.
One of the following values should be set in oflags:
If no message queue named name exists, and oflags has the O_CREAT bit set, the message queue is created by this function, taking two more arguments:
If oflags has the two bits O_CREAT and O_EXCL set and the message queue alread exists, this service fails.
If the O_NONBLOCK bit is set in oflags, the mq_send(), mq_receive(), mq_timedsend() and mq_timedreceive() services return -1 with errno set to EAGAIN instead of blocking their caller.
The following arguments of the mq_attr structure at the address attr are used when creating a message queue:
name may be any arbitrary string, in which slashes have no particular meaning. However, for portability, using a name which starts with a slash and contains no other slash is recommended.
name | name of the message queue to open; |
oflags | flags. |
ssize_t mq_receive | ( | mqd_t | q, |
char * | buffer, | ||
size_t | len, | ||
unsigned * | prio | ||
) |
Receive a message from a message queue.
If the message queue fd is not empty and if len is greater than the mq_msgsize of the message queue, this service copies, at the address buffer, the queued message with the highest priority.
If the queue is empty and the flag O_NONBLOCK is not set for the descriptor fd, the calling thread is suspended until some message is sent to the queue. If the queue is empty and the flag O_NONBLOCK is set for the descriptor fd, this service returns immediately a value of -1 with errno set to EAGAIN.
q | the queue descriptor; |
buffer | the address where the received message will be stored on success; |
len | buffer length; |
prio | address where the priority of the received message will be stored on success. |
int mq_send | ( | mqd_t | q, |
const char * | buffer, | ||
size_t | len, | ||
unsigned | prio | ||
) |
Send a message to a message queue.
If the message queue fd is not full, this service sends the message of length len pointed to by the argument buffer, with priority prio. A message with greater priority is inserted in the queue before a message with lower priority.
If the message queue is full and the flag O_NONBLOCK is not set, the calling thread is suspended until the queue is not full. If the message queue is full and the flag O_NONBLOCK is set, the message is not sent and the service returns immediately a value of -1 with errno set to EAGAIN.
q | message queue descriptor; |
buffer | pointer to the message to be sent; |
len | length of the message; |
prio | priority of the message. |
int mq_setattr | ( | mqd_t | mqd, |
const struct mq_attr *__restrict__ | attr, | ||
struct mq_attr *__restrict__ | oattr | ||
) |
Set message queue attributes
This service sets the flags of the mqd descriptor to the value of the member mq_flags of the mq_attr structure pointed to by attr.
The previous value of the message queue attributes are stored at the address oattr if it is not NULL.
Only setting or clearing the O_NONBLOCK flag has an effect.
mqd | message queue descriptor; |
attr | pointer to new attributes (only mq_flags is used); |
oattr | if not NULL, address where previous message queue attributes will be stored on success. |
0 | on success; |
-1 | with errno set if:
|
ssize_t mq_timedreceive | ( | mqd_t | q, |
char *__restrict__ | buffer, | ||
size_t | len, | ||
unsigned *__restrict__ | prio, | ||
const struct timespec *__restrict__ | timeout | ||
) |
Attempt, during a bounded time, to receive a message from a message queue.
This service is equivalent to mq_receive(), except that if the flag O_NONBLOCK is not set for the descriptor fd and the message queue is empty, the calling thread is only suspended until the timeout abs_timeout expires.
q | the queue descriptor; |
buffer | the address where the received message will be stored on success; |
len | buffer length; |
prio | address where the priority of the received message will be stored on success. |
timeout | the timeout, expressed as an absolute value of the CLOCK_REALTIME clock. |
int mq_timedsend | ( | mqd_t | q, |
const char * | buffer, | ||
size_t | len, | ||
unsigned | prio, | ||
const struct timespec * | timeout | ||
) |
Attempt, during a bounded time, to send a message to a message queue.
This service is equivalent to mq_send(), except that if the message queue is full and the flag O_NONBLOCK is not set for the descriptor fd, the calling thread is only suspended until the timeout specified by abs_timeout expires.
q | message queue descriptor; |
buffer | pointer to the message to be sent; |
len | length of the message; |
prio | priority of the message; |
timeout | the timeout, expressed as an absolute value of the CLOCK_REALTIME clock. |
int mq_unlink | ( | const char * | name | ) |
Unlink a message queue
This service unlinks the message queue named name. The message queue is not destroyed until all queue descriptors obtained with the mq_open() service are closed with the mq_close() service. However, after a call to this service, the unlinked queue may no longer be reached with the mq_open() service.
name | name of the message queue to be unlinked. |
0 | on success; |
-1 | with errno set if:
|