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

标签 posix message-queue

我正在开发一个简单的并行应用程序,我想在其中使用单个进程来维护有关一系列工作进程的状态信息。设置一个 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 模仿

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

警告:root 或您的 EUID 流氓可能会弄清楚您在做什么并跳入 mq_open 之间和 mq_unlink ?是的。

替代实现

或者,使用 SOCK_DGRAM socketpairpipe反而。这些提供与 POSIX 消息队列相似的语义 — attr.mq_msgsize变为 SO_SNDBUF/SO_RCVBUF 或遵守 PIPE_BUF 的协议(protocol),mq_notify变成 I/O 选择性(可能已经是这种情况了)——尽管你确实失去了消息优先级。

关于posix - 如何获得唯一的 POSIX 消息队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5761966/

相关文章:

c - 怀疑malloc。 C (Linux)

perl - 单台机器最快的 Perl IPC/消息队列是什么?

c - Mandelbrot 消息队列阻塞 - C

c# - ServiceStack Redis Mq认证

c - 无限循环等待 C 上的进程

c++ - 发送到失败的 C++//POSIX.4

c++ - sigqueue 可以与 pthreads 一起使用吗?

c - 如果进程被 SIGKILLed,操作系统 (POSIX) 是否完成对内存映射文件的修改?

java - 在 JMS 中使用 CCDT 文件连接到 IBM MQ

java - Akka vs Redis 作为可靠消息传递系统