如何获得唯一的POSIX消息队列?

Nor*_*sey 5 posix message-queue

我正在开发一个简单的并行应用程序,我想在其中使用单个进程来维护有关一系列工作进程的状态信息.设置POSIX消息队列似乎相对容易,其中所有工蜂都可以定期向状态维护者发送更新.我的问题?POSIX消息队列必须具有名称.我不想选一个名字; 所有我关心的是获得一个独特的消息队列,就像我使用SYSV消息队列一样IPC_PRIVATE.对于我可以使用的唯一文件名mkstemp(3)或我可以使用的唯一打开文件描述符tmpfile(3). 我应该如何获得唯一的POSIX消息队列?

pil*_*row 3

我不想选择一个名字;我所关心的是获得一个唯一的消息队列,就像我将 SYSV 消息队列与 IPC_PRIVATE 一起使用一样

嗯,对于 POSIX 消息队列,您必须指定一个名称,但您不必保留它,也不必允许其他人通过该名称使用相同的队列。

IPC_PRIVATE模仿

做什么mkstemptmpfile在幕后做什么。借用任何“tmp”/“temp”名称选择算法来生成一些“/reasonously_unique”,mq_open即 O_CREAT|O_EXCL,然后是mq_unlink它。然后子工作进程可以继承消息队列描述符。

警告:root 或您的 EUID 是否会发现您在做什么并在 和 之间mq_open跳转mq_unlink?是的。

替代实施

或者,使用 SOCK_DGRAMsocketpairpipe代替。这些提供了与 POSIX 消息队列类似的语义 -attr.mq_msgsize成为 SO_SNDBUF/SO_RCVBUF 或尊重 PIPE_BUF 的协议,mq_notify成为 I/O 选择性(可能已经是这种情况) - 尽管你确实失去了消息优先级。