我正在开发一个简单的并行应用程序,我想在其中使用单个进程来维护有关一系列工作进程的状态信息。设置一个 POSIX 消息队列似乎相对容易,其中所有工蜂都可以向状态维护者发送定期更新。我的问题? POSIX 消息队列必须有一个名称。我不想取名字;我所关心的是获得一个唯一的消息队列,就像我使用带有 IPC_PRIVATE
的 SYSV 消息队列一样。 .对于唯一的文件名,我可以使用 mkstemp(3)
或者对于唯一的打开文件描述符,我可以使用 tmpfile(3)
. 我应该如何获得唯一的 POSIX 消息队列?
最佳答案
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
好吧,使用 POSIX 消息队列,您必须指定一个名称,但您不必保留它,也不必允许其他人使用该名称使用相同的队列。
IPC_PRIVATE 模仿
做什么
mkstemp
和 tmpfile
在引擎盖下做。借用任何“tmp”/“temp”名称选择算法来生成“/reasonably_unique”,mq_open
它是 O_CREAT|O_EXCL,然后是 mq_unlink
它。然后子工作进程可以继承消息队列描述符。警告:root 或您的 EUID 流氓可能会弄清楚您在做什么并跳入
mq_open
之间和 mq_unlink
?是的。替代实现
或者,使用 SOCK_DGRAM
socketpair
或 pipe
反而。这些提供与 POSIX 消息队列相似的语义 — attr.mq_msgsize
变为 SO_SNDBUF/SO_RCVBUF 或遵守 PIPE_BUF 的协议(protocol),mq_notify
变成 I/O 选择性(可能已经是这种情况了)——尽管你确实失去了消息优先级。
关于posix - 如何获得唯一的 POSIX 消息队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5761966/