前言
上节Linux学习,我们学习了System V的
共享内存
,本节我们学习System V 的另一种通信方式 ---消息队列
文章目录
- 前言
- [一. 消息队列的原理](#一. 消息队列的原理)
- 二.创建消息队列
- [二. 查看消息队列](#二. 查看消息队列)
- [三. 删除消息队列](#三. 删除消息队列)
- [四. 读写数据](#四. 读写数据)
- 结束语
一. 消息队列的原理
消息队列的本质同共享内存一样,也是在内存中有一个又一个的
数据块
,但是操作系统对其先描述再组织的方式不同,是将这些数据块像队列的元素那样管理
,并且标识是哪个进程创建
的
二.创建消息队列
创建消息队列的函数是msgget()
同共享内存的参数和返回值一样。
第一个参数是用来
标识队列
,操作系统通过一系列算法生成的key值
ftok函数生成key值
,用pathname和proj_id
生成一个冲突较小的key值第二个参数是
创建方式
,有两种创建方式:
IPC_CREAT
:没有就创建,有则返回msqid,队列id
IPC_CREAT | IPC_EXCL
:没有就创建,有则报错还可以 | 上消息队列的权限
返回值是
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
:柔性数组,存储读写数据
结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。