消息队列


*消息队列是内核地址空间中的内部链表,通过内核在各个进程之间传递的内容。消息顺序发送到消息队列中,每个消息队列都有IPC标识符唯一地进行标识。

msgbuf结构

struct msgbuf{long mtype; //消息类型char mtext[1];  //消息数据
};

msgid_ds结构

struct msqid_ds{struct ipc_perm msg_perm;time_t  msg_stime;  //发送到队列的最后一个消息的时间戳time_t  msg_rtime;  //从队列中获取的最后一个消息的时间戳time_t  msg_ctime;  //对队列进行最后一次变动的时间戳unsigned long   __msg_cbytes;   //在队列上所驻留的字节总数msgqnum_t   msg_qnum;   //当前处于队列中的消息数目msglen_t    msg_qbytes; //队列中能容纳的字节的最大数目pid_t   msg_lspid   //发送最后一个消息进程的PIDpid_t   msg_lrpid   //接收最后一个消息进程的PID
};

ipc_perm结构

struct ipc_perm{key_t   key;    //函数msget()使用的键值uid_t   uid;    //用户的UIDgid_t   gid;    //用户的GIDuid_t   cuid;   //建立者的UIDgid_t   cgid;   //建立者的GIDunsigned short  mode;   //权限unsigned short  seq;    //序列号
};

键值构建ftok()函数

#include<sys/types.h>
#include<sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
//pathname必须是已经存在的目录

获得消息msgget()函数

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int msgget(key_t key, int msgflg);
/*第一个参数可以用ftok()函数生成
msgflg参数:
1.IPC_CREAT 如果内核中不存在该消息队列,则创建它
2.IPC_EXCL  当和IPC_CREAT一起使用时,如果队列早已存在则将出错
*/

发送消息msgsend()函数

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int msgsend(int msqid, const void *msgp, size_t msgsz, int msgflg);
/*
第一个参数从msgget()获得
第二个参数指向一个消息缓冲区
第三个参数消息的大小,以字节为单位,不包括消息类型的长度(4字节)
第四个参数设置成0表示忽略,设置成IPC_NOWAIT,如果消息队列已经满了,则消息不写进队列中,如果不设置则阻塞直到可以写消息为止
*/

接收消息msgrcv()函数

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
/*
第一个参数从msgget()获得
第二个参数消息缓冲变量的地址
第三个参数消息的大小,以字节为单位,不包括消息类型的长度(4字节)
第四个参数指定要从队列中获取的消息类型,内核查找队列中匹配类型的第一个到达的消息,如果传0则返回队列最早的消息,不管类型
第五个参数设置成IPC_NOWAIT,如果消息队列没有消息则返回ENOMSG,否则进程将阻塞直到满足条件的消息到达,如果客户等待消息的时候队列被删除则返回EIDRM,如果进程阻塞并等待消息的时候捕获信号则返回EINTR
*/

转载于:https://www.cnblogs.com/zzmv/p/5689787.html

linux消息队列的使用相关推荐

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

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

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

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

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

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

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

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

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

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

  6. [Linux]消息队列

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

  7. linux 消息队列机制

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

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

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

  9. linux消息队列总结

    1.消息队列简介 实现linux进程通信的方式有5种: --信号(Singal) --管道(Pipe) --消息队列(Message) --信号量(Semaphore) 每种进程通信方式实现方式和功能 ...

  10. linux 消息队列_Linux消息队列

    消息队列,Unix的通信机制之一,可以理解为是一个存放消息(数据)容器.将消息写入消息队列,然后再从消息队列中取消息,一般来说是先进先出的顺序.可以解决两个进程的读写速度不同(处理数据速度不同),系统 ...

最新文章

  1. 大跌眼镜!杭州一程序员年薪 30 万,竟靠偷车厘子缓解压力?
  2. Spring的quartz定时器重复执行二次的问题解决
  3. VMware 虚拟化编程(15) — VMware 虚拟机的恢复方案设计
  4. 汇编(8086cpu): 地址寄存器
  5. 如何处理扎堆而至的工作任务?
  6. spring定时器,定时器一次执行两次的问题
  7. Linux下文件查找命令
  8. 利用JSP编程技术实现一个简单的购物车程序
  9. flutter 必须掌握的CustomScrollView及Sliver类型控件的几种使用
  10. ASP一个小型搜索引擎的设计与实现
  11. 关于解决Ubuntu下apt-get的Unmet dependencies依赖错误
  12. 关闭vscode中的源代码管理
  13. VLAN通过多个交换机传输,实现同VLAN互通,不同VLAN不通
  14. Python实例浅谈--Python与C/C++相互调用
  15. 北师大数据结构期末考试复习
  16. python微信自动发消息_如何利用python3实现微信定时自动发消息和图片?
  17. python线性回归算法
  18. [附源码]java毕业设计企业员工管理系统
  19. 在VS中实现QT的多国语言翻译
  20. 周报(1114-1120)

热门文章

  1. SqlServer 左右内连接
  2. 解决Eclipse无法打开“Failed to load the JNI shared library”(转)
  3. 15、解决14中csv用excel打开乱码的问题 open('zhihu.csv','w',newline='',encoding='utf-8-sig')...
  4. 一文读懂HTTP/2及HTTP/3特性
  5. 朴素Paxos(Basic Paxos)算法java简易实现
  6. 第五章项目 体检套餐管理系统
  7. 关于项目中的日期提交
  8. DoTween(HOTween V2) 教程
  9. Android关于finish()与System.exit()都不能退出应用的原因
  10. 我的第一个python 代码