消息队列简记

简介:

消息队列简记


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

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

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

        #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

目录
相关文章
|
8月前
|
JSON 物联网 数据处理
C语言中高效处理JSON数据(cJSON库使用教程与入门指南)
cJSON 是轻量级C语言JSON库,适用于嵌入式系统,支持JSON解析与生成。本文详解其安装、使用方法及注意事项,助力C语言开发者高效处理JSON数据,适合初学者入门。
|
10月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
344 6
|
11月前
|
监控 算法 API
1688商品列表API数据解析
1688商品列表API支持通过关键词、价格、类目筛选商品,适用于电商分析与竞品监控,提供分钟级更新与高并发能力。支持批量获取商品信息、分页查询,附Python调用示例及完整错误处理逻辑。
|
前端开发 JavaScript Java
Java 学习路线规划及项目案例中的技术栈应用解析
内容包括:**Java 17核心特性**(如sealed class、record)与模块化开发;Spring Boot 3 + Spring Cloud微服务架构,涉及响应式编程(WebFlux)、多数据库持久化(JPA、R2DBC、MongoDB);云原生技术**如Docker、Kubernetes及CI/CD流程;性能优化(GraalVM Native Image、JVM调优);以及前后端分离开发(Vue 3、Spring Boot集成)。通过全栈电商平台项目实战,掌握从后端服务(用户、商品、订单)到前端应用(Vue 3、React Native)的全流程开发。
652 9
|
数据采集 5G 定位技术
时统设备有什么用途、时统终端、时间统一设备
时统设备是一种关键的时间同步系统,广泛应用于通信与科研领域。在通信领域,它确保核心网、无线基站及卫星通信的精准时间同步,提升网络稳定性与服务质量;在科研领域,支持粒子对撞、量子实验、化学反应研究及天文观测等,保障数据精确性与协同性。其高精度特性推动科技探索与发展,为现代科技进步提供重要支撑。文章版权归西安同步电子科技有限公司所有,严禁未经授权转载或洗稿。
|
人工智能 安全 API
这款流行 AI 工具被盗用挖取加密货币,这些隐患你需要知道
Docker 镜像被注入挖矿脚本并不是个别现象,而是一个需要引起重视的安全问题,本文向大家分享下 Higress 防范此类风险的相关经验。
739 111
|
11月前
|
存储 设计模式 JavaScript
RuoYi-Geek-SpringBoot3-文件上传模块
本文介绍基于桥接模式设计的文件上传模块,解耦存储服务与业务逻辑,支持多存储服务灵活适配,适用于单服务单存储桶及多服务多存储桶场景,提升系统扩展性与开发效率。
|
安全 前端开发 Java
struts2-046 远程代码执行 (CVE-2017-5638)
struts2-046 远程代码执行 (CVE-2017-5638)
1194 0
struts2-046 远程代码执行 (CVE-2017-5638)
|
监控 算法 安全
抖音电商API短视频挂接,商品曝光量翻倍!
在抖音电商API支持下,商家可通过短视频挂接商品,实现曝光量翻倍。本文详解操作步骤与优化策略,助您高效提升转化与销量。立即掌握短视频营销新技能!
|
人工智能 安全 测试技术
通义灵码:AI重构编码范式,开发者如何迎接“人机共生”时代?
本文探讨了以通义灵码为代表的AI编码助手如何推动软件开发从“人驱动工具”向“人机协同创造”演进。文章分析了其技术突破,如意图理解、上下文感知和可解释性,并讨论了开发者价值链条的重构,包括需求抽象、架构设计与代码审查能力的提升。同时,文章展望了行业变革对开发者身份、云生态竞争及技术伦理的影响,强调在AI驱动的“寒武纪大爆发”前夜,唯有持续进化才能适应未来软件工程的“人机共生”文明。
617 16