Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get a unique POSIX message queue?

I'm working on a simple parallel application in which I want to use a single process to maintain status information about a family of worker processes. It seems relatively easy to set up a POSIX message queue in which all of the worker bees can send periodic updates to the status maintainer. My problem? A POSIX message queue has to have a name. I don't want to pick a name; all I care about is getting a unique message queue, much as I would using SYSV message queues with IPC_PRIVATE. For a unique filename I could use mkstemp(3) or for a unique open file descriptor I could use tmpfile(3). How should I get a unique POSIX message queue?

like image 485
Norman Ramsey Avatar asked Oct 24 '22 13:10

Norman Ramsey


1 Answers

I don't want to pick a name; all I care about is getting a unique message queue, much as I would using SYSV message queues with IPC_PRIVATE

Well, with POSIX message queues, you do have to specify a name, but you don't have to preserve it nor allow others to use the same queue by that name.

IPC_PRIVATE mimicry

Do what mkstemp and tmpfile do under the hood. Borrow any of the "tmp"/"temp" name selection algorithms to generate something "/reasonably_unique", mq_open it O_CREAT|O_EXCL, and then mq_unlink it. Child worker processes can then inherit the message queue descriptor.

Caveat: Could root or your EUID gone rogue figure out what you're doing and jump in between the mq_open and the mq_unlink? Yes.

Alternative implementation

Alternatively, use a SOCK_DGRAM socketpair or pipe instead. Those offer similar semantics to POSIX message queues — attr.mq_msgsize becomes SO_SNDBUF/SO_RCVBUF or an agreement to respect PIPE_BUF, mq_notify becomes I/O selectability (probably already the case) — though you do lose message prioritization.

like image 66
pilcrow Avatar answered Dec 19 '22 11:12

pilcrow