msgget()和mq_open之间的区别

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

基本上, msggetmsgsndmsgrcv是System V IPC,而mq_openmq_sendmq_receive是POSIX IPC。

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

用于System V IPC的Oracle Document

适用于POSIX IPC的Oracle Document

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

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

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

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