Skip to content

POSIX Message Queue

POSIX message queues provide kernel-managed message-based IPC.

They preserve message boundaries, support message priorities, and can be integrated into event-driven programs through file descriptors on Linux.

What Problem It Solves

Use POSIX message queues when processes need to exchange discrete messages without manually implementing framing or shared buffer management.

Typical use cases:

  • command queues
  • event messages
  • producer/consumer IPC
  • priority-based local message delivery

Core Concepts

Concept Description
mq_open() Creates or opens a message queue
mq_send() Sends one message
mq_receive() Receives one message
mq_getattr() Reads queue attributes
mq_unlink() Removes the named queue
mq_notify() Registers asynchronous notification

Message Queue Attributes

Important fields:

  • mq_maxmsg: maximum number of messages
  • mq_msgsize: maximum size of each message
  • mq_curmsgs: current number of queued messages
  • mq_flags: blocking or non-blocking mode

Event Loop Integration

On Linux, a POSIX message queue descriptor can be used with epoll().

This makes it suitable for event-driven IPC designs:

mq_open(O_NONBLOCK)
epoll_ctl(EPOLL_CTL_ADD)
epoll_wait()
mq_receive()

Common Pitfalls

Warning

mq_receive() requires a buffer large enough for mq_msgsize, not just the expected message length.

Note

POSIX message queues are named kernel objects. Use mq_unlink() when the queue should be removed.