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

aks*_*aks 13 unix ipc pipe vxworks message-queue

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

请从vxworks和unix的角度解释.

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

但是管道内部不使用消息队列,那么管道是如何单向但消息队列不是?

您可以想到的其他差异(从设计或使用或其他方面)?

Ben*_*oit 17

消息队列是:

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

管道

  • 消息队列层是否为<---单向!
  • 拥有最大数量的元素,每个元素具有最大大小
  • 不是一个流动的界面.数据报语义,只列出消息队列
  • 在阅读时,将发送,直到有数据要读取
  • 在写入时,WILL PEND直到底层消息队列中有空间
  • 可以使用select facility等多个管道

这就是我现在能想到的.

  • 任务处于挂起状态,这意味着它正在等待某些事情发生:在这种情况下,队列中有一些东西(当读取时)或者有一个空槽(写入时). (2认同)

Ken*_*Ken -1

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