首页 > 其他分享 >消息队列

消息队列

时间:2023-03-05 22:15:37浏览次数:30  
标签:IPC 队列 int 消息 key 内核

System V IPC:

  Unix系统存在信号、管道等基本的进程间的通信机制;

  System V引入了三种高级的进程通信机制:

    消息队列、共享内存、信号量

  IPC对象(消息队列、共享内存、信号量)存在于内核中而不是文件系统中(虽然管道也是在内核中,但是它的释放由内核控制),由用户控制释放(即用户管理IPC对象的生命周   期),不像管道由内核控制。

  IPC对象通过其标识符来引用和访问,所有的IPC对象在内核中有唯一的标识ID,在用户空间有唯一的标识key

  linux IPC继承System V

 

  IPC对象是全局对象(即如果不手动的去释放将一直在内核中);

    可用ipcs、ipcrm等命令查看或删除

  每个IPC对象都有get函数创建

    msgget(消息队列)、shmget(共享内存)、semget(信号量)

  get函数中的参数要指定唯一的标识key

 

IPC对象的权限和所有者结构体

  

消息队列

  消息队列是内核中的一个链表(一个消息队列中可以有多个消息,每个消息都有类型(mtype));

  允许一个或多个进程往消息队列中写消息,但一个消息只能被一个进程读取,这个消息在读取完后就自动删除;

  每一个消息队列在内核中用一个唯一的IPC标识ID表示;

 

消息队列的属性:

  

 

消息队列的打开和创建:

  int msgget(key_t key,int flag)

  成功返回内核中消息队列的标识ID,失败返回-1

  参数:

    key:用户空间的唯一标识key;

    flag:IPC_CREAT_IPC_EXCL等

  若要创建消息队列,key可指定键值,也可将之设为IPC_PRIVATE。若打开进行查询,key必须为一个非零的值,否则是查询不到的

 

消息队列的控制:

  int msgctl(int msgqid,int cmd,struct msqid_ds *buf)

  成功返回0,失败返回-1

  参数:

    msgid:消息队列id

    buf:消息队列属性指针

    cmd:

      

 

 

 

消息发送到消息队列:

  ssize_t msgsnd(int msgqid,const void *ptr,size_t nbytes,int flag)

  成功返回0,失败-1

  参数:

    msgqid:消息队列id

    ptr:

      struct mymesg{

        long mtype;//消息的类型,是一个整数且大于0

        char mtex[512];//消息数据本身,是第三个参数的内容

      }

    nbytes:消息的大小,不包括mtype的长度

    flag:

      0:阻塞(消息队列中装满消息);

      IPC_NOWAIT:类似文件IO的非阻塞io标志;

      如果指定为IPC_NOWAIT,当队列已满,msgsnd立即出错返回EAGAIN;

      如果指定为0,调用msgsnd的进程阻塞直到有空间可以容纳要发送的消息,或则删除这个消息队列,或则这个进程捕捉到一个信号,并从信号处理函数返回

 

从消息队列中接受消息:

  ssize_t msgrcv(int msgqid,void *ptr,size_t nbytes,long type,int flag)

  成功返回消息的数据部分长度,失败-1

  参数:

    msgqid:消息队列id

    ptr:指向存放消息的指针

    nbytes:消息缓存的大小,不包括吧mtype的大小。nbytes=sizeif(struct mymesg)-sizeof(long)

    type:消息类型

      

    flag:0或IPC_NOWAIT      

标签:IPC,队列,int,消息,key,内核
From: https://www.cnblogs.com/zj-studyrecoding/p/17181818.html

相关文章

  • 我们为什么要用消息队列?
    消息队列是系统设计中存在时间最长的中间件之一,从系统有通信需求开始,就产生了消息队列。消息队列的使用场景在日常系统设计与实现的过程中,下面3种场景会涉及到消息队列:......
  • P1160 队列安排
    P1160队列安排队列安排题目描述一个学校里老师要将班上N个同学排成一列,同学被编号为1~N,他采取如下的方法:先将1号同学安排进队列,这时队列中只有他一个人;2~......
  • java——spring boot集成kafka——消息队列的流派
                   ......
  • C/C++ 数据结构优先级队列的实现(使用二级指针)
    #include<iostream>#include<Windows.h>#include<iomanip>//优先级队列的实现usingnamespacestd;#defineMaxSize5typedefintDataType;//队列中的元素类型......
  • 消息认证码
    消息认证码消息认证码的输入包含:任意长度的消息,密钥(发送者和接收者共享).输出:固定长度的密钥。消息认证码的主要功能:数据完整性:计算MAC时,将消息和密钥进行计算产生MAC值......
  • 外观数列(字符串)、用队列实现栈、二叉树的序列化与反序列化(树、深度优先搜索)
    外观数列(字符串)给定一个正整数n,输出外观数列的第n项。「外观数列」是一个整数序列,从数字1开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定......
  • 基于API+MQ消息双链路数据同步中间件技术方案
    一、数据同步的背景及意义随着公司业务的发展,业务系统也会变得越来越复杂繁多,业务数据或分散、或冗余于各个业务系统中,增加了数据的管理难度和维护成本。因此,中心......
  • C/C++ 数据结构使用数组实现队列的基本操作
    //使用数组实现队列#include<iostream>#include<Windows.h>usingnamespacestd;#defineMAXSIZE5//队列的最大容量typedefintDataType;//队列中的元素类型......
  • 力扣days04 栈与队列
    栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。力扣232.用栈实现队列用两个栈实现队列的......
  • 延迟队列实现订单超时自动取消
    在上一篇Java实现订单未支付超时自动取消,使用Java自带的定时任务TimeTask实现订单超时取消,但是有小伙伴提出这种实现,会有以下几个问题:线上服务挂了,导致服务下所有的定......