【问题标题】:POSIX Message Queues For Passing Data Between Pthreads用于在 Pthread 之间传递数据的 POSIX 消息队列
【发布时间】:2015-06-04 00:09:15
【问题描述】:

我有一个 Linux C 程序,我在其中在线程之间传递数据。我正在研究使用 POSIX 消息队列来解决这个问题,因为它们不需要互斥体/锁。

查看 mq_open() 调用,我必须指定权限和队列路径。这引出了两个问题。

  1. 是否有众所周知的指定文件路径的约定?我曾是 只是将队列转储到与可执行文件相同的文件夹中。
  2. 在权限方面,我打算使用 0600,但我想进一步限制它以防止其他进程访问队列(我在线程之间而不是进程之间共享数据)。鉴于队列“只是”一个文件,我可以使用带有 LOCK_EX 的flock() 来防止其他进程的访问吗?

提前致谢。

【问题讨论】:

  • 由于您使用线程,它们共享相同的地址空间。 (这是使用线程的全部意义所在。)为什么不使用例如一块内存或一个链表受互斥体保护来交换数据?
  • 有很多生产者-消费者以先进先出的方式进行。所以虽然,是的,我可以创建一个 FIFO 缓冲区并使用互斥锁对其进行管理,但我觉得消息队列中已经有很大一部分功能可用。

标签: c linux posix message-queue


【解决方案1】:

关于您的问题1,请查看您系统上mq_open 的实现说明。至少在 Linux 和 FreeBSD 消息队列名称​​必须以斜线开头,但不得包含其他斜线。

因此,虽然消息队列的名称 看起来 像一个路​​径,但它可能是文件系统中的实际 inode,也可能不是,具体取决于实现。根据mq_overview(7) 的说法,Linux 为消息队列使用了一个虚拟文件系统,它可能会被挂载,也可能不会被挂载。

鉴于此,问题2 可能没有实际意义。如果实际上甚至支持锁定 /dev/mqueue 中的文件并且它是否完成了您想要的,您必须运行测试或检查内核源代码。

【讨论】:

    【解决方案2】:

    我不会费心保护队列免受外部进程的影响。

    由于flock 只是建议性而非强制性的,它对您没有任何好处。 我也不确定flock 甚至可以在队列描述符上工作。

    以自己的用户身份运行您的服务当然会阻止其他进程以模式 0600 访问队列。

    但是,我会确保在启动时一次只有一个服务可以在队列上工作。 您可以使用 pid 锁定或 d-bus 来执行此操作。

    【讨论】:

      猜你喜欢
      • 2020-11-27
      • 2019-03-17
      • 2012-03-02
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 2011-05-10
      相关资源
      最近更新 更多