Linux进程间通信之消息队列
马上过年了,心里万般滋味。。。
一,消息队列
1,概念:“消息队列”是在消息的传输过程中保存消息的容器
2,消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。
对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;
对消息队列有读权限的进程则可以从消息队列中读走消息。
消息队列是随内核持续的。
3,编程注意事项:使用时先把数据封装成消息,把消息存入队列
编程步骤: 具体函数的用法可以用man手册查看(强力推荐)
(1)ftok()生产key
(2)使用msgget( ) 创建/获取消息队列,返回值是队列标识符
(3)使用msgsnd( ) 发送消息
使用msgrcv( ) 接收消息
(4)使用msgctl( ) 删除消息队列
4,实例:
sendmsg.c 用来发送消息的
// sendmsg.c #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> #include<string.h> struct my_msg { int mtype; // 消息类型 char buf[256]; }msg1, msg2; int main() { key_t key = ftok("./", 88); int msgid = msgget(key, 0666|IPC_CREAT); if(-1 == msgid) { perror("msgget failed!!!"); exit(1); } msg1.mtype = 2; strcpy(msg1.buf, "hello, msg2"); msgsnd(msgid, &msg1, sizeof(msg1), 0); // 阻塞 // msgsnd(msgid, &msg1, sizeof(msg1), IPC_NOWAIT); // 非阻塞 msg2.mtype = 1; strcpy(msg2.buf, "hello, msg1"); msgsnd(msgid, &msg2, sizeof(msg2), 0); // 阻塞 printf("消息发送完成,按回车销毁消息队列\n"); getchar(); if(-1 == shmctl(msgid, IPC_RMID, NULL)) { perror("shmctl failed"); exit(2); } return 0; }
recvmsg.c 用来接收消息的
// recvmsg.c #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> #include<string.h> struct my_msg { int mtype; // 消息类型 char buf[256]; }msg; int main() { key_t key = ftok("./", 88); // 获取消息队列 int msgid = msgget(key, 0); if(-1 == msgid) { perror("msgget failed!!!"); exit(1); } int res = msgrcv(msgid, &msg, sizeof(msg), 2, // 取消息类型为2的消息 0); printf("类型:%d, 内容:%s\n", msg.mtype, msg.buf); printf("消息接收完成,按回车销毁消息队列\n"); getchar(); if(-1 == shmctl(msgid, IPC_RMID, NULL)) { perror("shmctl failed"); exit(2); } return 0; }
5,运行结果
6,获取代码
git clone https://github.com/xcywt/xcyipc.git
有人看到这个麻烦再乌班图中试试这个库有没有建好。主要是学习github的一些用法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?