消息队列简称为队列.消息队列就是一些消息的列表.用户可以在消息队列中添加消息和读取消息等.从这点上看,消息队列具有一定的FIFO特性,但是它可以实现消息的随机查询,比FIFO具有更大的优势.同时,这些消息又是存在于内核中的,由"队列ID"来标识.
消息队列的实现包括创建或打开消息队列,添加消息,读取消息和控制消息队列这四种操作:
创建或打开消息队列使用的函数是msgget,这里创建的消息队列的数量会受到系统消息队列数量的限制;
添加消息使用的函数是msgsnd函数,它把消息添加到已打开的消息队列末尾;
读取消息使用的函数是msgrcv,它把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某一条消息;
控制消息队列使用的函数是msgctl,它可以完成多项功能.
msgget系统调用
该系统调用创建或打开一个消息队列.msgget函数语法:
其中,msgflag可以为:IPC_CREAT,IPC_EXEC,IPC_NOWAIT或者三者的组合.在一下两种情况下,该调用将创建一个新的消息队列:
如果没有消息队列与键值key相对应,并且msgfalg中包含IPC_CREAT标志位;
key参数为IPC_PRIVATE.
msgsnd系统调用
该系统调用行msgid代表的消息队列发送一个消息.msgsnd函数语法:
对于发送消息来说,有意义的msgflag标志位IPC_NOWAIT,指明在消息队列没有足够容纳要发送的消息时,msgsnd是否等待.造成msgsnd等待的条件有两种:
当前消息的大小与当前消息队列中的字节数之和操作了消息队列的总容量;
当前消息队列中的消息数(单位:个)不小于消息队列的总容量(单位:字节数),此时,虽然消息队列中的消息数目很多,但基本上都只有一个字节.
msgsnd解除阻塞的条件有三个:
不满足上述两个,即消息队列中有容纳该消息的空间
msqid代表的消息队列被删除
调用msgsnd的进程被进程打断
msgrcv系统调用
该系统调用从ID为msgid的消息队列中读取一个消息,并把消息存储子啊msgq指向的msgbuf结构中.msgrcv函数语法:
msgrcv解除阻塞的条件有三个:
消息队列中有了满足条件的消息;
msqid代表的消息队列被删除;
调用msgrcv的进程被信号中断.
msgctl系统调用
相关文章
- 【Linux】IPC进程间通信System V:并发编程实战指南(二)-三:🔥 System V 消息队列(了解)
- Linux内核入门(十一)——进程间通信:消息队列
- RabbitMQ 优点和缺点- 消息可靠性:RabbitMQ 提供了持久化功能和消息确认机制,确保消息在各种情况下都能可靠地存储和处理。 灵活的路由:通过多种交换机类型和绑定规则,RabbitMQ 能够灵活地路由消息到指定的队列。 支持多种消息协议:实现了 AMQP 等(MQTT、STOMP)标准化、开放的消息队列协议,使其能够与多种语言编写的应用程序进行通信。 插件化扩展:RabbitMQ 提供了丰富的插件系统,可以通过插件扩展功能,如死信队列、压缩、追踪等。 高可用性:支持集群模式和镜像队列,确保服务的可用性 易用性和可管理性:提供了丰富的 API 和管理工具,以及多种客户端库和框架支持,易于集成和使用。 多语言支持:RabbitMQ 支持多种编程语言的客户端,包括 Java、Python、Ruby、C#、Node.js 等,方便开发人员集成到各种应用中。 高性能:在处理大量并发消息时表现出色。 广泛的社区支持:拥有庞大的开发者社区和丰富的文档资源。 劣势: 性能和吞吐量较低:相比于 Apache Kafka 等面向大数据流处理的消息队列系统,RabbitMQ 的吞吐量较低,不适合处理海量的实时数据流。RabbitMQ 的设计更注重消息的可靠性和灵活性,而非极高的吞吐性能。
- 【BES2500x系列 -- RTX5操作系统】深入探索CMSIS-RTOS RTX -- 同步与通信篇 -- 消息队列和邮箱处理 --(四)-1 介绍
- Linux进程间通信IPC学习笔记之消息队列(SVR4)
- Linux下多任务间通信和同步-概述
- Linux进程间通信-消息队列(mqueue)
- c/c++ linux 进程间通信系列6,使用消息队列(message queue)
- Linux 进程间通信(管道、共享内存、消息队列、信号量)
- Linux环境编程之IPC进程间通信(五):Posix消息队列1