17

管道和消息队列之间有什么区别?

请从 vxworks 和 unix 的角度进行解释。

我认为管道是单向的,但消息队列不是。

但是管道内部不使用消息队列,那么为什么管道是单向的而消息队列不是呢?

您还可以想到哪些其他差异(从设计或使用或其他角度)?

4

5 回答 5

21

消息队列是:

  • 单向
  • 固定数量的条目
  • 每个条目都有一个最大尺寸
  • 创建时分配的所有队列内存(# 条目 * 条目大小)
  • 类似数据报的行为:读取条目会将其从队列中删除。如果您不读取全部数据,则其余数据将丢失。例如:发送一个 20 字节的消息,但接收方读取 10 个字节。剩余的 10 个字节丢失。
  • 任务只能使用 msqQReceive 在单个队列上挂起(有一些方法可以使用替代 API 进行更改)
  • 发送时,如果队列已满,您将挂起(并且您不执行 NO_WAIT)
  • 接收时,如果队列为空,您将挂起(并且您不执行 NO_WAIT)
  • 接收和发送支持超时

管道

  • 是消息队列之上的一层 <--- 单向!
  • 有最大数量的元素,每个元素都有最大尺寸
  • 不是流媒体接口。数据报语义,只列出消息队列
  • 读取时,将挂起,直到有数据要读取
  • 写入时,将挂起,直到底层消息队列中有空间
  • 可以使用选择设施等待多个管道

这就是我现在能想到的。

于 2010-03-19T00:37:24.227 回答
1

我还在UNIX 中发现了 IPC 的这种差异。它指出它们之间的区别在于消息队列和管道是第一个存储/检索数据包中的信息。而管道则逐个字符地进行。

消息队列:

消息队列:类似于管道的匿名数据流,但在数据包中存储和检索信息。

管道

管道:通过标准输入和输出接口的双向数据流,逐个字符读取

我在这里也发现了这个问题:Pipe vs msg queue

于 2014-05-02T03:52:17.837 回答
1

“VxWorks 管道与 UNIX 管道有很大不同”,vxWorks 文档说,他们不是在开玩笑。 这是手册页

似乎毫不夸张地说,Unix 管道和 vxWorks 管道之间的唯一相似之处在于它们是 IPC 的一种形式。功能不同,API 不同,实现肯定也大不相同。

于 2010-03-20T04:01:17.667 回答
1

消息队列和管道的比较: - 一个消息队列可用于双向传递数据 - 消息不需要在先进先出的基础上读取,但可以有选择地处理源:见http://www .cs.vsb.cz/grygarek/dosys/IPC.txt

于 2014-07-31T19:00:38.057 回答
-1

MQ 具有内核持久性,可以被多个进程打开。

于 2010-03-18T14:48:57.893 回答