msgget()和mq_open之间的区别

时间:2014-07-16 15:50:42

标签: c linux message-queue

我阅读了有关消息队列操作的信息,例如msgget(),msgsnd()和msgrcv()。但是当我在堆栈溢出中搜索与消息队列相关的问题时,我才知道还有另一组消息队列操作,例如mq_open(),mq_send(),mq_receive()。任何人都可以告诉我这两种类型的消息队列之间有什么区别,以及广泛使用哪种类型的消息队列?

2 个答案:

答案 0 :(得分:7)

msgXXX系列继承自SysV。 mq_XXX系列由POSIX创建。然而,这两个家庭都是POSIX的一部分。

这两个系列具有不同的功能集,最重要的是SysV变体允许指定不同的消息类型。这为处理消息和分配优先级提供了灵活性。相反,POSIX系列始终返回具有最高优先级的最旧消息。

作为一项规则,除非您真正需要使用SysV,否则POSIX系列是更好的选择。 POSIX接口也不那么麻烦。一个额外的好处(在Linux上)是表示队列标识符的POSIX mqd_t类型实际上是文件描述符。这样可以非常方便地使用selectpoll和类似工具的POSIX队列。

答案 1 :(得分:4)

基本上,msggetmsgsndmsgrcv是System V IPC,而mq_openmq_sendmq_receive是POSIX IPC。< / p>

一个很好的解释:System V IPC vs POSIX IPC

Oracle Document for System V IPC

Oracle Document for POSIX IPC

总之,POSIX IPC是在System V IPC之后设计的。因此,许多旧系统仅支持System V IPC,而新系统也开始支持POSIX IPC。而且,由于POSIX IPC可以了解System V IPC的优缺点,因此可以更好地设计和实现POSIX IPC。一个值得注意的区别是所有POSIX IPC接口都是线程安全的。