我阅读了有关消息队列操作的信息,例如msgget(),msgsnd()和msgrcv()。但是当我在堆栈溢出中搜索与消息队列相关的问题时,我才知道还有另一组消息队列操作,例如mq_open(),mq_send(),mq_receive()。任何人都可以告诉我这两种类型的消息队列之间有什么区别,以及广泛使用哪种类型的消息队列?
答案 0 :(得分:7)
msgXXX
系列继承自SysV。 mq_XXX
系列由POSIX创建。然而,这两个家庭都是POSIX的一部分。
这两个系列具有不同的功能集,最重要的是SysV变体允许指定不同的消息类型。这为处理消息和分配优先级提供了灵活性。相反,POSIX系列始终返回具有最高优先级的最旧消息。
作为一项规则,除非您真正需要使用SysV,否则POSIX系列是更好的选择。 POSIX接口也不那么麻烦。一个额外的好处(在Linux上)是表示队列标识符的POSIX mqd_t
类型实际上是文件描述符。这样可以非常方便地使用select
,poll
和类似工具的POSIX队列。
答案 1 :(得分:4)
基本上,msgget
,msgsnd
,msgrcv
是System V IPC,而mq_open
,mq_send
,mq_receive
是POSIX IPC。< / p>
一个很好的解释:System V IPC vs POSIX IPC
Oracle Document for System V IPC
总之,POSIX IPC是在System V IPC之后设计的。因此,许多旧系统仅支持System V IPC,而新系统也开始支持POSIX IPC。而且,由于POSIX IPC可以了解System V IPC的优缺点,因此可以更好地设计和实现POSIX IPC。一个值得注意的区别是所有POSIX IPC接口都是线程安全的。