一. 什么是linux的消息队列:

消息队列是提供了一种从一个进程向另一个进程发送一个数据块的方法。每个数据块都被认为含有
一个类型,接收进程可以独立的接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道> 的同步和阻塞的问题。但是消息队列和命名管道一样,每个数据块都有一个最大长度的限制。

LInux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度。

二.LInux中使用消息队列

linux提供一系列消息队列的函数接口来让我们方便地使用它来实现进程间的通信。消息队列函数有
msgget,msgctl,msgsnd,msgrcv四个函数组成。

1.msgget函数:创建队列,返回队列的句柄

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
函数原型:int msgget(key_t key,int msgflag);key:0(IPC_PRIVATE):会建立新的消息队列。大于0的32位整数:视参数msglag来确定操作。通常要求此值来源于ftok返回的IPC键值msgflag: 0消息队列标识符,若不存在则函数会报错。IPC_CREAT:当msgflag&IPC_CREAT为真时,如果内核中不存在键值与key相等的消息队列,则新建一个消息队列;如果存在这样的消息队列,返回此消息队列的标识符。IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的消息队列,则新建一个消息队列,如果存在这样的消息队列则报错。返回:成功:返回消息队列的标识符,出错:-1,消息原因存在与error中> 备注说明:上述msgflg参数为模式标志参数,使用时需要与IPC对象存取权限如(0666)进行|运算来确定消息队列的存取权限。
错误代码:EACCES:指定消息队列已存在,但调用进程没有权限访问他。EEXIST:key指定的消息队列已存在,而msgflg中同时指定IPC_CREAT和IPC_EXCL标志ENOENT:key指定的消息队列不存在同时msgflg中没有指定IPC_CREAT标志ENOMEM:需要建立消息队列,但内存不足。ENOSPC:需要建立消息队列,但是达到了系统限制

2.msgctl函数:设置和获取队列的属性(后续补充)

 int msgctl(int msqid, int cmd, struct msqid_ds *buf);msgid:消息队列的句柄标识符。cmd:IPC_STAT:获得msgid的消息队列头数据到buf中IPC_SET:设置消息队列的属性,要设置的属性需先存储在buf中,可设置的属性包括:msg_perm.uid,msg_perm.gid,msg_perm.mode msg_qbytes;

3.msgsnd函数:将消息写入到消息队列中

int msgsnd(int msgid,const void* msgp,size_t msgsz,int msgflg);msgid:消息队列的句柄标识符。msgp:发送给队列的消息。msgp可以是任何类型的结构体,<<<但第一个字段必须为long类型,即表明此发送消息的类型 !!!>>>,msgrcv根据此接收消息。msgp定义的参照格式如下:struct s_msg{ /*msgp定义的参照格式*/long type; /* 必须大于0,消息类型 */char mtext[256]; /*消息正文,可以是其他任何类型*/}msgp;msgze:要发送消息的带下,不含消息类型占用的4个字节,即mtex的长度。msgflg:0:当消息队列满时,msgsnd将会阻塞,知道消息能写到消息队列中。IPC_NOWAIT:当消息队列已满时候,msgsnd函数不等待立即返回。IPC_NOERROR:若发送的消息大于SIZE字节,则把消息截断,截断部分将丢弃,且不通知发送进程。返回 0:成功,-1:失败,错误原因存在与error中EAGAIN:参数msgflg设为IPC_NOWAIT,而消息队列已满EIDRM:标识符为msqid的消息队列已被删除EACCESS:无权限写入消息队列EFAULT:参数msgp指向无效的内存地址EINTR:队列已满而处于等待情况下被信号中断EINVAL:无效的参数msqid、msgsz或参数消息类型type小于0备注:  msgsnd()为阻塞函数,当消息队列容量满或消息个数满会阻塞。消息队列已被删除,则返回EIDRM错误;被信号中断返回E_INTR错误。如果设置IPC_NOWAIT消息队列满或个数满时会返回-1,并且置EAGAIN错误。msgsnd()解除阻塞的条件有以下三个条件:1.不满足消息队列满或个数满两个条件,即消息队列中有容纳该消息的空间。2.msqid代表的消息队列被删除。3.调用msgsnd函数的进程被信号中断。

4.msgrcv函数:从消息队列中读取消息

 size_t msgrcv(int msgid,void* msgp,size_t msgsz,long msgtyp,int msgflg);msgid:消息队列标识符msggp:存放消息的结构体,结构体类型要与msgsnd函数发送的消息类型相同。msgze:要接收消息的大小,不含消息类型占用的4个字节。msgtyp:0:接收第一个消息。>0: 接收类型等于msgtyp的第一个消息<0:接收类型等于或者小于msgtype绝对值的第一个消息msgflg:0:阻塞式接收消息,没有该类型的消息msgrcv函数一直阻塞等待。IPC_NOWAIT:如果没有返回条件的消息调用立即返回,此时错误码为ENOMSGIPC_EXCEPT:与msgtype配合使用,返回队列中第一个类型不为msgtype的消息IPC_NOERROR:如果队列中满足调节的消息内容大于所请求的size字节,则把消息截断,截断部分将被丢弃返回:成功:实际读取到的消息数据长度。错误:-1,错误原因存于error中E2BIG:消息数据长度大于msgsz而msgflag没有设置IPC_NOERROREIDRM:标识符为msqid的消息队列已被删除EACCESS:无权限读取该消息队列EFAULT:参数msgp指向无效的内存地址ENOMSG:参数msgflg设为IPC_NOWAIT,而消息队列中无消息可读EINTR:等待读取队列内的消息情况下被信号中断msgrcv()解除阻塞的条件有以下三个:1:消息队列中有了满足条件的消息。2:msqid代表的消息队列被删除。3:调用msgrcv()的进程被信号中断。

linux 消息队列API相关推荐

  1. linux消息队列非亲缘,linux进程

    linux进程Tag内容描述: 1.linux消息队列进程通信 一.消息队列的基本概念消息队列(也叫做报文队列)是Unix系统V版本中3种进程间通信机制之一.另外两种是信号灯和共享内存.这些IPC机制 ...

  2. linux.调整收发队列,linux消息队列通信

    程序目的:学习linux消息队列通信 所用主要函数:msgget(),msgsnd(),msgrcv(),msgctl() 首先介绍每个函数的用法: (1)msgget 使用格式: #include ...

  3. linux消息队列操作

    对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列 消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可 ...

  4. linux 消息队列 msgget/msgsnd/msgrecv

    专栏内容:linux下并发编程 个人主页:我的主页 座右铭:天行健,君子以自强不息:地势坤,君子以厚德载物. 目录 前言 概述 原理 消息队列的大小 查看资源 接口 代码演示 结尾 前言 本专栏主要分 ...

  5. php 阻塞消息队列,linux 消息队列阻塞

    php 使用socket告知Python,可以在socket上声明是及时推送还是延迟推送######哦?愿闻其详 那要是很多用户同时并发呢######system 调用外部程序是一种办法######@ ...

  6. PHP下操作Linux消息队列完成进程间通信的方法

    2019独角兽企业重金招聘Python工程师标准>>> 来源:http://www.jb51.net/article/24353.htm 关于Linux系统进程通信的概念及实现可查看 ...

  7. [Linux]消息队列

    我们知道进程间通信的方法有多种,主要有管道,消息队列,信号量,共享内存,socket等.之前介绍过管道,今天再介绍一个新的概念–消息队列. 消息队列:将一个进程到另一个进程之间发送数据块的方式.这些发 ...

  8. linux 消息队列机制

    现在我们来讨论第三种也是最后一种System V IPV工具:消息队列.在许多方面看来,消息队列类似于有名管道,但是却没有与打开与关闭管道的复杂关联.然而,使用消息队列并没有解决我们使用有名管道所遇到 ...

  9. linux消息队列的内核限制

    [from:http://blog.csdn.net/cwj649956781/article/details/8804908] 消息队列: 1.每次msgrcv一个消息,1.那个消息会在内核中移除 ...

  10. unix iorp等待队列_FreeRTOS+POSIX之消息队列API详解

    FreeRTOS+POSIX概述 可移植操作系统接口(Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义A ...

最新文章

  1. 数据结构-队(C语言代码)
  2. django中模型类的创建
  3. LCD液晶屏静电防护方案
  4. HarmonyOS之JS/Java跨语言调试
  5. 项目周期一般多久_办公家具定制的特殊性是需要一定的制作周期
  6. MyBatis中增删改操作
  7. asp.net 网站开发流程总结
  8. vue.js 入门案例,双向绑定实现任务清单
  9. android修改对话框大小设置,android – 如何更改对话框首选项消息的文本大小?...
  10. SQL Server 自增字段归零等问题
  11. sql文件查看器_ACCDB MDB Explorer for Mac(MDB文件查看器) v2.4.7
  12. alexnet- tensorflow
  13. Java *1.13(代数:求解2 × 2线性方程组)可以使用Cramer法则解下面的2 x 2线性方程组,假定ad-bc不为0:
  14. 阿兰图灵和冯诺依曼,谁才是可称得起计算机之父呢?
  15. 金蝶K3后台SQL修改数据-科目余额表、科目表核算项目
  16. 高精度加法(蓝桥杯)
  17. 使用Layer弹窗时遇到Layer.Close()后dom元素延迟性销毁的问题 @Gyb
  18. 智能运维 VS 传统运维|AIOps服务管理解决方案全面梳理
  19. mysql 存储过程中 if else的使用 和赋值方式
  20. 【RabbitMQ】学习笔记

热门文章

  1. 答粉丝问|火狐浏览器插件简介
  2. 第八届“图灵杯”NEUQ-ACM程序设计竞赛(全题解详细)
  3. 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 G题 数学思维
  4. 阿铭Linux_网站维护学习笔记201903026
  5. AI人工智能282G教学视频+PPT
  6. 华为Linux笔记本拆机,华为MateBook D怎么拆机?华为MateBook D拆机图文步骤详解
  7. python操作cad的模块_Process Autocad by python
  8. java中ftl什么文件_.ftl文件 是什么文件 freemarker
  9. pcie总线与cpci总线_PCI和CPCI
  10. 升级macOS Big Sur 后 HIDPI 失效的解决办法