.. include:: POSIX Message Queues ==================== .. toctree:: :maxdepth: 1 .. libreoffice:: mqueue.odg Overview -------- .. sidebar:: Documentation * `man -s 7 mq_overview `__ * **Message queue parameters** * Maximum number of messages * Maximum size of a single message * *Realtime guarantees* (memory is never swapped out) * **Message priorities** * Messages are sent with a priority * Higher prioritized messages overtake lower prioritized messages * Linux: 0 through 32768-1 (POSIX: 0 through 31) * **Linux Specific** * The POSIX API tries to differentiate itself from file IO * Although very similar * |longrightarrow| Message queue descriptors (``mqd_t``) *are* file descriptors * |longrightarrow| Usable in event loops (`man -s 2 select `__, `man -s 2 poll `__, `man -s 7 epoll `__) Setup: Message Queue Creation ----------------------------- .. sidebar:: Documentation * `man -s 3 mq_open `__ * `mq_open `__ is used for creating *and* opening (much like `man -s 2 open `__) * When ``flags`` contains ``O_CREAT`` ... * ``mode`` is required (permissions, see `man -s 2 open `__) * ``attr`` is required .. literalinclude:: code/create.cpp :caption: :download:`create.cpp ` :language: c++ ``mqueue`` File System ---------------------- * Message queues *are* visible as files, actually (just a little funny) * |longrightarrow| ``mqueue`` filesystem * Usually mounted on ``/dev/mqueue`` .. code-block:: console # mkdir /dev/mqueue # mount -t mqueue none /dev/mqueue * All message queues visible in ``/dev/mqueue`` .. code-block:: console $ ls -l /dev/mqueue/ ... -rw-r--r--. 1 jfasch jfasch 80 Nov 11 09:08 my-queue ... * File content: metadata |longrightarrow| *great for debugging* * ``QSIZE``: number of contained (unread) *bytes* (*not* messages) * ``NOTIFY, SIGNO, NOTIFY_PID``: historical baggage (nobody uses signals for notification anymore) .. code-block:: console $ cat /dev/mqueue/my-queue QSIZE:0 NOTIFY:0 SIGNO:0 NOTIFY_PID:0 Teardown: Message Queue Deletion -------------------------------- .. sidebar:: Documentation * `man -s 3 mq_unlink `__ * Just like `man -s 2 unlink `__ .. literalinclude:: code/unlink.cpp :caption: :download:`unlink.cpp ` :language: c++ * ``rm`` would work too (on Linux) .. code-block:: console $ rm /dev/mqueue/my-queue Usage: Open An Existing Message Queue, And Produce Into It ---------------------------------------------------------- .. sidebar:: Documentation * `man -s 3 mq_open `__ * `man -s 3 mq_send `__ * Open for writing: ``flags`` contains ``O_WRONLY`` * Use `mq_send `__ to produce a message into queue |longrightarrow| ``priority`` * *Attention*: ``mq_send()`` returns 0 on success (not the number of bytes written) .. literalinclude:: code/produce.cpp :caption: :download:`unlink.cpp ` :language: c++ * |longrightarrow| Eight bytes in queue .. code-block:: console $ cat /dev/mqueue/my-queue QSIZE:8 NOTIFY:0 SIGNO:0 NOTIFY_PID:0 Usage: Open An Existing Message Queue, And Consume From It ---------------------------------------------------------- .. sidebar:: Documentation * `man -s 3 mq_open `__ * `man -s 3 mq_receive `__ * Open for reading: ``flags`` contains ``O_RDONLY`` * Use `mq_receive `__ to consume a message from queue |longrightarrow| ``priority`` .. literalinclude:: code/consume.cpp :caption: :download:`consume.cpp ` :language: c++ * |longrightarrow| Queue now empty .. code-block:: console $ cat /dev/mqueue/my-queue QSIZE:0 NOTIFY:0 SIGNO:0 NOTIFY_PID:0 **Do Not Use**: ``mq_notify()`` ------------------------------- .. sidebar:: Documentation * `man -s 3 mq_notify `__ **Obscure feature ...** * Only shown because of its obscurity * Specification *predates* that of event loops * Guess what ... **SIGNALS** * Please read yourself and be disturbed!