用于在Pthread之间传递数据的POSIX消息队列

时间:2015-03-30 20:07:08

标签: c linux posix message-queue

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

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

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

2 个答案:

答案 0 :(得分:3)

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

因此,虽然消息队列的名称看起来像路径一样,但它可能是也可能不是文件系统中的实际inode,具体取决于实现。根据{{​​3}},Linux使用虚拟文件系统来存储消息队列,可以安装也可以不安装。

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

答案 1 :(得分:2)

我不打算保护队列免受外部进程的攻击。<​​/ p>

因为flock只是建议而非强制性的,所以对你没有任何好处。 此外,我不确定flock是否会对队列描述符起作用。

以其自己的用户身份运行您的服务将使其他进程无法以模式0600访问队列。

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