Linux如何使用消息队列通信_Linux消息队列IPC开发步骤

发布时间 - 2025-11-25 00:00:00    点击率:
首先创建消息队列并获取标识符,再定义含mtype的消息结构,使用msgsnd发送数据,最后通过msgrcv按类型接收消息。

在Linux系统中,消息队列是一种重要的进程间通信(IPC)机制,允许不同进程通过内核维护的消息链表发送和接收数据。相比管道,消息队列具有异步通信、支持多进程访问、可按类型接收等优势。以下是使用Linux消息队列进行IPC开发的具体步骤。

创建或打开消息队列

使用 msgget() 函数来获取一个消息队列的标识符。该函数需要一个键值(key_t)和权限标志。

通常使用 ftok() 生成一个唯一的键,再调用 msgget() 创建或访问队列:

key_t key = ftok("/tmp", 'A');  // 生成唯一键
int msqid = msgget(key, 0666 | IPC_CREAT); // 创建或打开队列

如果队列已存在,则直接返回其ID;否则创建新的消息队列。

定义消息结构并发送消息

消息必须遵循特定结构:第一个成员为 long 类型的 mtype,表示消息类型,其余部分为消息内容。

例如:

struct msgbuf {
    long mtype;
    char mtext[256];
};

使用 msgsnd() 发送消息:

struct msgbuf msg;
msg.mtype = 1;
strcpy(msg.mtext, "Hello from sender");
msgsnd(msqid, &msg, strlen(msg.mtext)+1, 0);

第三个参数是消息正文的字节数(不含 mtype),第四个参数控制阻塞行为。

接收指定类型的消息

使用 msgrcv() 函数从队列中读取消息。可以指定接收的消息类型:

  • 若 mtype > 0:接收第一个类型为 mtype 的消息
  • 若 mtype = 0:接收队列中第一个消息(忽略类型)
  • 若 mtype

示例:

struct msgbuf msg;
msgrcv(msqid, &msg, 256, 1, 0); // 接收类型为1的消息
printf("Received: %s\n", msg.mtext);

控制与删除消息队列

使用 msgctl() 对消息队列进行控制操作,如获取状态、设置属性或删除队列。

删除队列示例:

msgctl(msqid, IPC_RMID, NULL); // 标记删除队列

注意:只有当所有进程都关闭对该队列的引用后,队列才会真正被释放。

基本上就这些。掌握 msgget、msgsnd、msgrcv 和 msgctl 四个核心函数,就能实现可靠的进程间消息传递。不复杂但容易忽略的是消息类型的设计和资源清理。开发时建议配合 perror() 处理错误,并在程序结束前调用 msgctl 清理资源。


# linux  # 字节  # linux系统  # 标识符  # perror  # 并发  # 异步  # 第一个  # 的是  # 发送消息  # 是一种  # 就能  # 才会  # 并在  # 或删除  # 不含  # 第三个 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 公司门户网站制作流程,华为官网怎么做?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  深圳网站制作培训,深圳哪些招聘网站比较好?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何在IIS中新建站点并配置端口与IP地址?  python中快速进行多个字符替换的方法小结  如何挑选最适合建站的高性能VPS主机?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何快速搭建FTP站点实现文件共享?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Laravel中的withCount方法怎么高效统计关联模型数量  如何在腾讯云服务器上快速搭建个人网站?  如何选择可靠的免备案建站服务器?  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  微信公众帐号开发教程之图文消息全攻略  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  敲碗10年!Mac系列传将迎来「触控与联网」双革新  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  香港服务器租用费用高吗?如何避免常见误区?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  bing浏览器学术搜索入口_bing学术文献检索地址  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  linux top下的 minerd 木马清除方法  零服务器AI建站解决方案:快速部署与云端平台低成本实践  JS经典正则表达式笔试题汇总  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  如何确认建站备案号应放置的具体位置?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Laravel如何使用查询构建器?(Query Builder高级用法)  新三国志曹操传主线渭水交兵攻略  Laravel如何创建自定义中间件?(Middleware代码示例)  Android使用GridView实现日历的简单功能  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何快速生成橙子建站落地页链接?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载