[英]difference between msgget() and mq_open
我阅读了有关消息队列操作,如msgget(),msgsnd()和msgrcv()。 但是当我在堆栈溢出中搜索与消息队列相关的问题时,我才知道还有另一组消息队列操作,例如mq_open(),mq_send(),mq_receive()。 任何人都可以告诉我这两种类型的消息队列之间有什么区别,以及广泛使用哪种类型的消息队列?
msgXXX
系列继承自SysV。 mq_XXX
系列由POSIX创建。 然而,这两个家庭都是POSIX的一部分。
这两个系列具有稍微不同的功能集,最重要的是SysV变体允许指定不同的消息类型。 这为处理消息和分配优先级提供了灵活性。 相反,POSIX系列始终返回具有最高优先级的最旧消息。
通常,除非您真正需要使用SysV,否则POSIX系列是更好的选择。 POSIX接口也不那么麻烦。 一个额外的好处(在Linux上)是表示队列标识符的POSIX mqd_t
类型实际上是文件描述符。 这允许使用select
, poll
和类似工具非常方便地使用POSIX队列。
基本上, msgget
, msgsnd
, msgrcv
是System V IPC,而mq_open
, mq_send
, mq_receive
是POSIX IPC。
一个很好的解释: System V IPC vs POSIX IPC
用于System V IPC的Oracle Document
总之,POSIX IPC是在System V IPC之后设计的。 因此,许多旧系统仅支持System V IPC,而新系统也开始支持POSIX IPC。 而且,由于POSIX IPC可以了解System V IPC的优缺点,因此可以更好地设计和实现POSIX IPC。 一个显着的区别是所有POSIX IPC接口都是线程安全的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.