Day57 - POSIX Message Queue IPC¶
Overview¶
This chapter introduces POSIX message queue IPC (mqueue).
Unlike shared memory IPC, POSIX message queues are:
- kernel-managed
- message-oriented
- synchronized by kernel
- priority-aware
- asynchronous capable
POSIX mqueue is designed for:
- producer / consumer IPC
- middleware event delivery
- RT-style message passing
- asynchronous userspace communication
POSIX Message Queue Architecture¶
sender process
|
| mq_send()
v
+----------------------+
| kernel message queue |
| /demo_mq |
+----------------------+
|
| mq_receive()
v
receiver process
The queue object exists inside kernel space.
Processes communicate by accessing the same named queue object.
Queue Naming¶
Queue names must start with /.
Example:
The name is:
- not a filesystem path
- not a UNIX socket path
- a kernel IPC namespace key
Linux exposes mqueue objects under:
Core APIs¶
mq_open()¶
Create or open queue.
mq_send()¶
Send one message.
mq_receive()¶
Receive one message.
mq_close()¶
Close queue descriptor.
mq_unlink()¶
Remove queue object name.
Queue Attributes¶
struct mq_attr¶
mq_maxmsg¶
Maximum number of queued messages.
mq_msgsize¶
Maximum size of one message.
Receive buffer size must be:
Otherwise:
mq_curmsgs¶
Current queued message count.
Message-Oriented IPC¶
Unlike stream sockets or pipes:
Message boundaries are preserved.
Priority Queue¶
POSIX mqueue supports message priority.
Kernel dequeue order:
- higher priority first
- FIFO inside same priority
Example:
Receive order:
Blocking Queue Behavior¶
Sender¶
If queue becomes full:
until receiver consumes messages.
Receiver¶
If queue becomes empty:
until sender sends messages.
Non-Blocking Queue¶
Using:
changes queue behavior.
Non-blocking sender¶
Queue full:
Non-blocking receiver¶
Queue empty:
mq_notify()¶
POSIX async notification mechanism.
Queue transition:
can trigger:
- signal notification
- thread callback
SIGEV_SIGNAL¶
Kernel sends signal when queue becomes readable.
mq_notify() Characteristics¶
One-shot registration¶
After one notification:
Must re-register again.
Correct Pattern¶
epoll + mqueue¶
Linux mqueue descriptors can be monitored by:
- poll()
- select()
- epoll()
This allows:
architecture.
epoll Event Model¶
timerfd Integration¶
timerfd was integrated into epoll loop for:
- periodic queue monitoring
- queue statistics
Example:
printed every second.
signalfd Integration¶
signalfd replaced traditional signal handlers.
Signals:
- SIGINT
- SIGTERM
became normal fd events inside epoll loop.
Unified Linux Event Loop¶
Final architecture:
This is a classic Linux daemon architecture.
POSIX vs Linux Event Model¶
mq_notify()¶
POSIX-style async notification:
epoll¶
Linux-style readiness model:
Shared Memory vs Message Queue¶
Shared Memory¶
Pros:
- zero-copy
- highest throughput
- lowest latency
Cons:
- synchronization complexity
- user-managed queue logic
POSIX Message Queue¶
Pros:
- kernel synchronization
- simple API
- message boundary
- priority support
Cons:
- kernel copy overhead
- queue capacity limitation
- lower throughput