进程间通信之消息队列

目录

一、消息队列的原理 

 二、消息队列的接口

2.1创建消息队列

2.2向消息队列发送消息

2.3接收消息:

2.4操作消息队列的接口

2.5代码测试:

 2.6 ipcs命令

 2.7 消息队列的特性


队列的特性是先进先出,只要满足这个特性的数据结构都可称为队列

消息队列:就是操作系统内核用链表实现的队列

一、消息队列的原理 

1.1 msgqueue采用链表来实现消息队列, 该链表是由系统内核维护

  • 1.2 系统中可能有很多的msgqueue, 每个MQ用消息队列描述符(消息队列ID: qid) 来区分,qid是唯一 的,用来区分不同的MQ。

 

1、可以按照消息的类型先进先出

2、也可以按照原本的顺序先进先出

 二、消息队列的接口

  • 2.1创建消息队列

  • int msgget(key_ t key, int msgflg)

参数:

  • key:消息队列的标识符
  • msgflg:创建的标志,例如IPC_CREAT
  • IPC_CREAT:如果不存在就创建:按位或上一个权限(8进制的数字)
  • 返回值:
    • 成功:返回队列ID
    • 失败:返回-1,并设置erron
  • 2.2向消息队列发送消息

int msgsnd(int   msqid,   const   void  *msgp,    size_t   msgsz,   int    msgflg);

参数:

  • msgid :消息队列ID
  • msgp :指向msgbuf 的指针,用来指定发送的消息
    • 操作系统为该函数发送的消息定义了发送格式,只是定义了一部分,另一部分要程序员自己去定义
  • msgsz:要发送消息的长度,消息内容的长度,这个参数的取值并不是整个
    •                                                       struct msgbuf结构体的大小,而是结构中mtext的大小
  • msgflg:创建标记,如果指定IPC_NOWAIT,失败会立即返回
    • 0:阻塞发送
    • IPC_NOWAIT:非阻塞发送

2.3接收消息:

ssize_t msgrcv(int msqid, void *msgp, sizet msgsz, long msgtyp, int msgflg)

参数:

  • msgid:消息队列ID
  • msgp:指向msgbuf的指针,用来接收消息(出参
  • msgsz:要接收消息的长度
    • 注意:参数msgsz 指定由msgp 参数指向的结构的成员mtext的最大大小(以字节为单位),msgtyp 也有,3种方式:

msgtyp:接收消息的方式

  • 1. msgtyp = 0:读取队列中的第一条消息(不在乎当前队头元素时什么消息类型,将他当作普通队列来处理)
  • 2. msgtyp > 0:读取队列中类型为msgtyp 的第一条消息。(就是读取对列元素中第一个香蕉)
  •                                                除非在msgflg中指定了MSG_ EXCEPT, 将读取类型不等于msgtyp 绝对值的第一条消息
  • 3. msgtyp< : 0:读取队列中最小类型小于或等于msgtyp 绝对值的第一条消息

  • msgflg:创建标记,如果指定IPC_ NOWAIT,获取失败会立刻返回(非阻塞)

返回值:

  • 成功返回实际读取消息的字节数,,
  • 失败返回-1,并设置erron
  • 2.4操作消息队列的接口

int msgctl(int msqid, int cmd, struct msqid_ ds *buf);

参数:

  • msqid:消息队列ID
  • cmd:控制命令,
    • 例如IPC_ RMID,删除命令 ,
    • IPC STAT,获取状态
  • buf:存储消息队列的相关信息的buf

返回值:

  • 成功根据不同的cmd有不同的返回值,
  • 失败返回-1,并设置erron
  • 2.5代码测试:

  • 创建一个消息队列,写端发送消息队列,读端读取消息队列中的内容

 然后执行一下代码

 2.6 ipcs命令

 2.7 消息队列的特性

1、生命周期跟随操作系统内核

 2、ipcrm  -q   [qid] 删除消息队列

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值