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

POSIX Message Queues For Passing Data Between Pthreads

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

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

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

提前致谢。

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

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

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

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

因为 flock 只是建议性的而不是强制性的,它对你没有任何好处。 我也不确定 flock 是否会在队列描述符上工作。

运行 你的服务作为它自己的用户当然会阻止其他进程访问模式 0600 的队列。

不过,我会确保在启动时一次只有一个服务可以在一个队列上工作。 您可以使用 pid 锁定或 d-bus 来这样做。