#Linux#进程间通信# 消息队列(message queue)

消息队列实际上是操作系统在内核为我们创建的一个队列,通过这个队列的标识符key,每一个进程都可以打开这个队列,每个进程都可以通过这个队列向这个队列中插入一个结点或者获取一个结点来完成不同进程间的通信。用户组织一个带有类型的数据块,添加到队列中,其他的进程从队列中获取数据块,即消息队列发送的是一个带有类型的数据块;消息队列是一个全双工通信,可读可写(可以发送数据,也可以接受数据)。消息队列生命周期随内核,如果没有释放消息队列或者没有关闭操作系统,消息队列会一直存在。

消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度(System V标准)。

消息队列和之前讨论过的匿名管道,命名管道有较大的区别,主要有以下两点:

  • 一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达,而管道和FIFO是相反的,进程向对方写消息时,匿名管道和命名管道必需已经打开来读。 
  • IPC的持续性不同。匿名管道和命名管道是随进程的持续性,当匿名管道和命名管道最后一次关闭发生时,仍在匿名管道和命名管道中的数据会被丢弃。消息队列是随内核的持续性,即一个进程向消息队列写入消息后,然后终止,另外一个进程可以在以后某个时刻打开该队列读取消息。只要内核没有重新自启,消息队列没有被删除。即匿名管道和命名管道是同步的,消除队列是异步的。

消息队列中的每条消息通常具有以下属性:

  • 一个表示优先级的整数;
  • 消息的数据部分的长度;
  •  消息数据本身;

消息队列在内核中的表示

#Linux#进程间通信# 消息队列(message queue)_第1张图片

 

消息队列(message queue)同样分System V标准与POSIX 标准,详细参考

#Linux#进程间通信# System V标准&POSIX标准

你可能感兴趣的:(进程间通信,进程间通信,消息队列(message,queue),message,queue)