进程篇——进程间通信《消息队列》

一、什么是消息队列?

消息队列就是消息的链表,存放在内核中并由消息队列标识符表示。
消息队列提供了一个从一个进程向另一个进程发送数据块的方法,每一个数据块都可以被认为是有一个类型,接收者接受的数据块可以有不同的类型。
但是和管道类似的是,它有一个不足就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数(MSGMNB),系统上消息队列的总数上线(MSGMNI)。
内核为每个IPC对象维护了一个数据结构struc ipc_perm,用于标识消息队列,让进程知道当前操作的是那个消息队列。
每一个Msqid_ds 表示一个消息队列,并通过msqid_ds.msg_first、msg_last 维护一个先进先出的msg链表队列,当发送一个消息到该消息队列时,把发送的消息队列构造成一个msg的结构对象,并添加到msqid_ds.msg_first、msg_last维护的链表队列。

二、特点

  • 是消息的链表。具有特定的格式,存放在内存中, 由消息队列标识符标识
  • 消息队列允许一个或者多个消息队列向他写入与读取消息
  • 消息列可实现消息的随机查询,不一定要以先进先出的顺序读取,也可以按照类型进行读取。
  • 生命周期随内核,消息队列会一直存在,需要我们显示的调用接口删除或者使用命令删除。
  • 消息队列可以双向通信
  • 克服了管道口只能承载无格式字节流的缺点

三、相关函数

  • msgget(): 用来创建或者访问一个消息队列;
      #include<sys/types.h>
      #include<sys/ipc.h>
      #include<sys/msg.h>
      int msgget(key_t key, int msgflag);

参数
key: 某个消息队列的名字,用ftok()产生
msgflag: 有两个选项IPC——CREAT 和 IPC_EXCL,单独使用IPC_CREAT,如果消息队列不存在则创建之,如果存在则打开返回;单独使用IPC_EXCL是没有意义的;两个同时使用,如果消息队列不存在则创建之,如果存在就出错返回。
返回值: 成功安徽一个非负整数,即消息队列的标识码,失败返回-1

#include<sys/types.h>
#include<sys/ipc.h>
key_t ftok(const char *pathname ,int proj_id);
调用成功返回一个key值,用于创建消息队列,如果失败,返回-1;
  • msgsnd(): 用来把消息添加到消息队列中;
  • msgrcv(): 从一个消息队列中获取消息;
  • msgctl(): 作用和共享内存相似;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值