【Linux】进程间通信 -- System V 消息队列

前言

上节Linux学习,我们学习了System V的共享内存,本节我们学习System V 的另一种通信方式 --- 消息队列

文章目录

  • 前言
  • [一. 消息队列的原理](#一. 消息队列的原理)
  • 二.创建消息队列
  • [二. 查看消息队列](#二. 查看消息队列)
  • [三. 删除消息队列](#三. 删除消息队列)
  • [四. 读写数据](#四. 读写数据)
  • 结束语

一. 消息队列的原理

消息队列的本质同共享内存一样,也是在内存中有一个又一个的数据块,但是操作系统对其先描述再组织的方式不同,是将这些数据块像队列的元素那样管理,并且标识是哪个进程创建

二.创建消息队列

创建消息队列的函数是msgget()

同共享内存的参数和返回值一样。

  1. 第一个参数是用来标识队列,操作系统通过一系列算法生成的key值

    ftok函数生成key值,用pathname和proj_id生成一个冲突较小的key值

  2. 第二个参数是创建方式,有两种创建方式:
    IPC_CREAT:没有就创建,有则返回msqid,队列id
    IPC_CREAT | IPC_EXCL:没有就创建,有则报错

    还可以 | 上消息队列的权限

  3. 返回值是msqid,队列id

二. 查看消息队列

查看消息队列的命令 ipcs -q

key:消息队列的key值
msqid:消息队列的队列id
owner:创建该消息队列的用户
perms:权限
used-bytes:使用的字节数
messages:消息数

三. 删除消息队列

指令删除ipcrm -q 消息队列id
函数删除msgctl()

具体操作同共享内存的shmctl()

msqid :消息队列的id
cmd :具体操作,使用位图的方式传入,删除是IPC_RMID
buf :其他操作,比如IPC_STAT获取消息队列属性需要传入的消息队列的结构体

四. 读写数据

写数据 的函数是msgsnd()
读数据 的函数是msgrcv()

msqid:消息队列的队列id
msgp:读写数据使用的结构体
msgsz:读写数据的大小
msgflg:一般为0(当消息队列满时,会阻塞,等到可以再写入消息为止)
msgtyp:标识是哪个进程写入的数据。优先接收某进程的第一个消息

读写数据的结构体 如下

mtype:标识该数据块是哪个进程写入
mtext:柔性数组,存储读写数据

结束语

感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。

相关推荐
码视野6 分钟前
基于 Spring Boot + Vue3 的【智慧公厕微负压排风除臭与客流人感空间占用导引中台】设计与实现(含PRD/三端高保真源码/大屏)
前端·vue.js·人工智能·spring boot·后端
ERD Online20 分钟前
Cursor 连上 MCP:读一张 ER 图,提交一版建议
数据库·后端·开源·cursor·mcp
爱笑鱼22 分钟前
Android 系统启动机制(五):system_server 是 init 启动的,还是 Zygote fork 出来的?
android
思考着亮25 分钟前
4.依赖注入_Depends用法_四大应用场景_Yield生成器原理.
后端
思考着亮31 分钟前
3.全局中间件_洋葱模型执行机制_跨域CORS配置
后端
新时代牛马33 分钟前
SPL-TPL 链式启动:spl.c 与CONFIG_TPL 三阶段加载
c语言·开发语言
布莱克60536 分钟前
链表详解:定义、作用、应用场景及与数组的区别(C/C++ 实战)
c语言·开发语言·c++·链表
思考着亮1 小时前
5.数据库ORM_连接池_自动事务_增删改查高级语法与字典解包
后端
叫我:松哥1 小时前
基于flask仿小米商城管理系统,使用flask开的一个商场网站
数据库·后端·python·flask
智购科技无人售货机工厂1 小时前
2026自动售货机防拆机物理安全设计:从安全螺丝到结构互锁的工程实践~YH
android·网络·驱动开发·python·单片机·安全·云原生