POSIX message queues
POSIX defines a set of nonblocking message-passing facilities known as message queues.
Like pipes, message queues are named objects that operate with readers
and writers.
As a priority queue of discrete messages, a message queue has
more structure than a pipe and offers applications more
control over communications.
POSIX message queues provide a familiar interface for many
realtime programmers, in that they're similar to the
mailboxes
found in many realtime executives.
Resource Managerschapter in this book) .
There's a fundamental difference between QNX OS native messages and POSIX message queues: our messages block—they copy their data directly between the address spaces of the processes sending the messages. POSIX message queues, on the other hand, implement a store-and-forward design in which the sender need not block and may have many outstanding messages queued. POSIX message queues exist independently of the processes that use them. You could use message queues in a design where a number of named queues will be operated on by a variety of processes over time.
Which should you use? Message queues, being defined by POSIX, are more portable, but native messages have several advantages:
- unbounded, non-fixed message length
- priority inheritance
- known senders
Message queues resemble files, at least as far as their interface is concerned. POSIX defines the following functions that you can use to manage message queues (see the C Library Reference for more information):
Function | Description |
---|---|
mq_open() | Open a message queue |
mq_close() | Close a message queue |
mq_unlink() | Remove a message queue |
mq_send() | Add a message to the message queue |
mq_receive() | Receive a message from the message queue |
mq_notify() | Tell the calling process that a message is available on a message queue |
mq_setattr() | Set message queue attributes |
mq_getattr() | Get message queue attributes |
For strict POSIX conformance, you should create message queues that start with a single slash (/) and contain no other slashes. But note that we extend the POSIX standard by supporting pathnames that may contain multiple slashes. This allows, for example, a company to place all its message queues under its company name and distribute a product with increased confidence that a queue name will not conflict with that of another company.
In QNX OS, all message queues created appear in the filename space under the directory /dev/mqueue.
For example:
mq_open() name: | Pathname of message queue: |
---|---|
/data | /dev/mqueue/data |
/acme/data | /dev/mqueue/acme/data |
/qnx/data | /dev/mqueue/qnx/data |
ls /dev/mqueue