消息队列简记

简介:

消息队列简记


在了解了信号量共享内存之后,消息队列自然就比较容易理解了。

之前提到共享内存的操作不是原子的, 那么便可以结合信号量来进行控制。

消息队列是另外一种进程间通信的手段, 使用以下几个函数调用。

        #include <sys/types.h>

        #include <sys/ipc.h>

        #include <sys/msg.h>//一般上述两个头文件都被此文件包含

        int msgget(key_t key, int msgflg);

        int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

        ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

        int msgctl(int msqid, int cmd, struct msqid_ds *buf);

由此可见几种IPC機制都是类似的。


msgget(key, msgflg);

        同样的道理,该函数创建或获取一个和key相关的消息队列,一般使用 0666 | IPC_CREAT作为msgflg的值。看到0666很容易想到777(关于chmod),很容易可以知道是设置权限。

操作的是低9位, 666就是110110110。从高到低对应着u(用戶),g(组别), o(其他)的读、写和执行权限。比如最高三位110表示u有读和写权限,但没有执行权限。

函数返回一个msgid,供其它相关函数使用。


msgsnd(msgid, msgp, msgsz, msgflg);

        一般来说,消息队列中的消息成员都是一个结构体,该结构体至少包含两个成员: 一个是消息类型,另一个是消息数据。

比如:

#define MSGSIZ 1024 struct msg_st { long msg_type; char msg_text[MSGSIZ]; };

        而msgp就是指向要传送的消息的指针。

        msgsz是消息的大小,不包含消息类型。

        msgflg一般置0。


msgrcv(msgid, msgp, msgsz, msgtyp, msgflg);

        与msgsnd类似,不同的是第4个参数msgtyp。

        msgtyp指定了要接收的消息类型, 一共有3种情况。

                1. msgtyp为0, 表示按顺序接收消息队列中的成员。

                2. msgtyp为某正数,表示接收类型为该正数的消息,类型由消息结构体中的msg_type指定。

                3. msgtyp为某负数,表示接收类型小于等于该负数绝对值的类型消息。

        msgctl一般用来撤销消息队列,形如 msgctl(msgid, IPC_RMID, 0)。

        下面是个小实验:

用于发送消息的msg1.c:

#include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/msg.h> #include "msg_st.h" int main(){ int i; int msg_id; char buf[MSGSIZ]; struct msg_st msg_ptr; msg_id = msgget((key_t)1234, 0666 |IPC_CREAT); for(i=0; i<3; i++){ printf("请輸入第%d条要发送的消息:", i); scanf("%s", buf); msg_ptr.msg_type = i; strcpy(msg_ptr.msg_text, buf); msgsnd(msg_id, (void *)&msg_ptr, 512, 0); } printf("已发送完消息./n"); return 0; }

用于接收消息的msg2.c(指定接收数据类型为1的消息):

#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/msg.h> #include "msg_st.h" int main(int argc, char *argv[]){ int msg_id; struct msg_st msg_ptr; msg_ptr.msg_type = 1; msg_id = msgget((key_t)1234, 0666 | IPC_CREAT); printf("要接收的消息类型为%ld/n", msg_ptr.msg_type); msgrcv(msg_id, (void *)&msg_ptr, 512, msg_ptr.msg_type, 0); printf("接收到的消息为:%s/n", msg_ptr.msg_text); msgctl(msg_id, IPC_RMID, 0); return 0; }


Jason Lee

2009-11-16 p.m

目录
相关文章
|
10月前
|
消息中间件 人工智能 运维
乐言科技:云原生加速电商行业赋能,云消息队列助力降本 37%
乐言科技依托云原生架构及阿里云云原生产品体系,实现基础设施与业务解耦以及弹性调度,在提升业务稳定性的同时,显著增加研发效能并降低运维成本,加速电商客户定制化需求交付,推动云计算与 AI 技术在电商领域的深度融合。
630 102
|
10月前
|
消息中间件 Cloud Native 大数据
云原生 Kafka 问卷调研启动,你的声音很重要!参与赢精美礼品!
Apache Kafka 作为高吞吐的分布式消息系统,支持实时数据采集、传输、存储及处理,广泛应用于日志收集、监控数据聚合、流式数据处理、在线和离线分析等场景,是大数据生态的核心组件。然而,随着云计算的快速发展,传统 Kafka 架构在云环境中的局限性日益凸显。
241 18
|
10月前
|
消息中间件 Cloud Native 大数据
ApsaraMQ x Confluent 云原生 Kafka 线上沙龙
云消息队列 Kafka 版是基于 Apache Kafka 构建的全托管服务,依托于阿里云强大的基础设施,对 Apache Kafka 进行了深度重构,通过存算分离架构、高弹性扩展、云服务深度集成等优化,致力于打造更经济、更稳定、更弹性的云原生 Kafka 产品,助力企业在数字化与智能化转型中,实现业务的稳定增长与创新突破。同时,阿里云作为全球消息流领域领导者 Confluent 在中国大陆地区唯一的合作商,推出云消息队列 Confluent 版,为企业提供集成消息流式处理与大数据系统的一站式解决方案。
|
消息中间件 网络协议 RocketMQ
RocketMQ Controller 模式 始终更新成本机ip
ontrollerAddr=192.168.24.241:8878 但是日志输出Update controller leader address to 127.0.0.1:8878。导致访问失败
301 3
|
消息中间件 存储 弹性计算
云消息队列 RabbitMQ 版实践解决方案评测
随着企业业务的增长,对消息队列的需求日益提升。阿里云的云消息队列 RabbitMQ 版通过架构优化,解决了消息积压、内存泄漏等问题,并支持弹性伸缩和按量计费,大幅降低资源和运维成本。本文从使用者角度详细评测这一解决方案,涵盖实践原理、部署体验、实际优势及应用场景。
|
消息中间件 Java 开发工具
消息队列 MQ使用问题之如何使用DefaultMQPushConsumer来消费消息
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
消息中间件 数据安全/隐私保护 RocketMQ
消息队列 MQ使用问题之遇到消费速度是固定的并且导致了堆积,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
存储 开发工具 Android开发
git repo工具详细使用教程
git repo工具详细使用教程
|
存储 自然语言处理 算法
C语言学习前五章思维导图式总结(超详细,复习必备)
C语言学习前五章思维导图式总结(超详细,复习必备),源文件在 process  on(在线流程图)上面,同名,需要多多支持。
1408 1
C语言学习前五章思维导图式总结(超详细,复习必备)
|
机器学习/深度学习 算法
一文通俗讲透树模型
决策树模型因为其特征预处理简单、易于集成学习、良好的拟合能力及解释性,是应用最广泛的机器学习模型之一。