开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:消息队列概述】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11043
消息队列概述
内容介绍:
一、消息队列中通信的方式
二、消息队列的特点
三、在 ubuntu12.04 中消息队列限制值
一、消息队列中通信的方式
消息队列是进程中另一种通信方式,消息队列是消息的链表,存放在内存中,由内核维护。
它并不存放在文件系统当中,它不是文件,与是文件的有名管道和无名管道不同。
链表中有多个节点,每个节点有不同的消息,有多个进程,一个进程往消息队列中放消息,添加节点,另外一个进程可以从消息队列中取节点下来,读取消息,一旦消息的节点被读取出来之后,这个节点就能释放。
即有进程往上放消息,有的进程往下取取消息,就实现了进程间的通信
二、消息队列的特点
1、消息队列中的消息是有类型的
2、消息队列中的消息是有格式的。(有名管道无名管道中的消息是没有类型的,通信需要双方约定好)
3、消息队列可以实现消息的随机查询。消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取。
4、消息队列允许一个或多个进程向它写入或者读取消息。
5、与无名管道、命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除。
6、每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的。(类似于进程号)
7、一旦打开了一个消息队列,只有内核重启或人工删除消息队列时,该消息队列才会被删除。若不人工删除消息队列,消息队列会一直存在于系统中。
三、在 ubuntu12.04 中消息队列限制值如下
1、每个消息内容最多为8K字节
2、每个消息队列容量最多为16K字节(内核中可以创建多个消息队列)
3、系统中消息队列个数最多为1609个
4、系统中消息个数最多为16384个
SystemV 提供的 IPC 通信机制需要一个 key 值,通过 key 值就可在系统内获得一个唯一的消息队列标识符。
key 值可以是人为指定的,也可以通过 ftok 函数获得。
消息队列标识符是打开消息队列之后创建的,相当于一个文件描述符,用来代表文件,消息队列标识符用来代表消息队列,是打开消息队列后获得的消息队列号。消息队列不是文件因此没有路径,相关的两个操作进程通过key值保证打开的是同一操作队列,即一个操作进程通过key值创建一个操作阵列,另一个key值相同的操作阵列就能打开,相当于命名管道中的路径,但不是路径。
注意人为命名key值是比较危险的,避免与其它操作阵列 key 值相同而冲突。
而不相关进程通过 ftok 函数来获取有效 key 值,当 key 值相同,就能保证操作的消息队列是一样的,而且能有效的与其它进程使用的 key 值不同,避免冲突。