【问题标题】:How to get a unique POSIX message queue?如何获得唯一的 POSIX 消息队列?
【发布时间】:2011-08-11 08:13:54
【问题描述】:

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

【问题讨论】:

    标签: posix message-queue


    【解决方案1】:

    我不想取名字;我所关心的只是获得一个独特的消息队列,就像我使用带有 IPC_PRIVATE 的 SYSV 消息队列一样

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

    IPC_PRIVATE 模仿

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

    警告:root 或您的 EUID 流氓是否会弄清楚您在做什么并跳入 mq_openmq_unlink 之间?是的。

    替代实现

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

    【讨论】:

      猜你喜欢
      • 2016-06-03
      • 2019-03-17
      • 1970-01-01
      • 2020-11-27
      • 2020-04-18
      • 1970-01-01
      • 2013-03-21
      • 2016-03-21
      • 2015-04-12
      相关资源
      最近更新 更多