一、什么是消息队列

消息队列,Unix的通信机制之一,可以理解为是一个存放消息(数据)容器。将消息写入消息队列,然后再从消息队列中取消息,一般来说是先进先出的顺序。可以解决两个进程的读写速度不同(处理数据速度不同),系统耦合等问题,而且消息队列里的消息哪怕进程崩溃了也不会消失。

二、消息队列常用函数和使用流程

消息队列 msgget()、msgsend()、msgrcv()、msgctl()

最简单的消息内存的使用流程

①ftok函数生成键值

②msgget函数创建消息队列

③msgsnd函数往消息队列发送消息

④msgrcv函数从消息队列读取消息

⑤msgctl函数进行删除消息队列

三、消息队列常用函数介绍

1.ftok函数生成键值

每一个消息队列都有一个对应的键值(key)相关联(共享内存、信号量也同样需要)。

头文件:#include<sys/ipc.h>

函数声明: key_t ftok(const char *path ,int id);
参数说明:

path:一个已存在的路径名id:0~255之间的一个数值,代表项目ID,自己取

返回值:
成功返回键值(相当于32位的int)。出错返回-1

示例:
key_t key = ftok( “/tmp”, 66);

2.msgget函数创建消息队列

头文件:#include<sys/msg.h>

函数声明: int msgget(key_t key,int flag);
参数说明:

  key:为ftok生成的键值flag:为所需要的操作和权限,可以用来控制创建一个消息队列。IPC_CREAT:创建新的消息队列;IPC_EXCL:与IPC_CREAT一同使用,表示如果要创建的消息队列已经存在,则返回错误;IPC_NOWAIT:读写消息队列要求无法满足时,不阻塞。返回值: 调用成功返回队列标识符,否则返回-1;

在以下两种情况下,将创建一个新的消息队列:
1、如果键的值是IPC_PRIVATE。
2、或者键的值不是IPC_PRIVATE,并且键所对应的消息队列不存在,同时标志中指定IPC_CREAT。

返回值:

成功返回消息队列ID;出错返回-1

示例:

int id = msgget(key,IPC_CREAT|IPC_EXCL|0666);创建一个权限为0666(所有用户可读可写,具体查询linux权限相关内容)的消息队列,并返回一个整形消息队列ID,如果key值已经存在有消息队列了,则出错返回-1。

int id = msgget(key,IPC_CREAT|0666);创建一个权限为0666(所有用户可读可写,具体查询linux权限相关内容)的消息队列,并返回一个消息队列ID,如果key值已经存在有消息队列了,则直接返回一个消息队列ID。

3.msgsnd函数往消息队列发送消息

头文件:#include<sys/msg.h>

函数声明: int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
参数说明:
msgid:msgget函数返回的消息队列标识符。
msg_ptr:是一个指向准备发送消息的指针,但是消息的数据结构却有一定的要求,**指针msg_ptr所指向的消息结构一定要是以一个长整型成员变量开始的结构体,*接收函数将用这个成员来确定消息的类型。所以消息结构要定义成这样:
struct my_message {
long int message_type;
/
The data you wish to transfer */
};
msg_sz 是msg_ptr指向的消息的长度,注意是消息的长度,而不是整个结构体的长度,也就是说msg_sz是不包括长整型消息类型成员变量的长度。

msgflg 用于控制当前消息队列满或队列消息到达系统范围的限制时将要发生的事情。

返回值:

如果调用成功,消息数据的一分副本将被放到消息队列中,并返回0,失败时返回-1.

示例:
msgsnd(id,(void *)&ckxmsg,512,0);

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

头文件:#include<sys/msg.h>

函数声明: int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg);
参数说明:

msgid, msg_ptr, msg_st 的作用也函数msgsnd()函数的一样。

msgtype 可以实现一种简单的接收优先级。如果msgtype为0,就获取队列中的第一个消息。如果它的值大于零,将获取具有相同消息类型的第一个信息。如果它小于零,就获取类型等于或小于msgtype的绝对值的第一个消息。

msgflg 用于控制当队列中没有相应类型的消息可以接收时将发生的事情。

返回值:

调用成功时,该函数返回放到接收缓存区中的字节数,消息被复制到由msg_ptr指向的用户分配的缓存区中,然后删除消息队列中的对应消息。失败时返回-1

示例:
msgrcv(id,(void *)&ckxmsg,512,1,0);

5.msgctl函数对消息队列进行控制

头文件:#include<sys/msg.h>

函数声明:

该函数用来控制消息队列,它与共享内存的shmctl函数相似,它的原型为:

int msgctl(int msgid, int command, struct msgid_ds *buf);

参数说明:

command是将要采取的动作,它可以取3个值,

IPC_STAT:把msgid_ds结构中的数据设置为消息队列的当前关联值,即用消息队列的当前关联值覆盖msgid_ds的值。
IPC_SET:如果进程有足够的权限,就把消息列队的当前关联值设置为msgid_ds结构中给出的值
IPC_RMID:删除消息队列
buf是指向msgid_ds结构的指针,它指向消息队列模式和访问权限的结构。msgid_ds结构至少包括以下成员:

struct msgid_ds
{
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};

返回值:

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

Linux中消息队列的用法相关推荐

  1. Linux系统中消息队列,共享内存、信号和线程的基本操作使用方法

    Linux系统中消息队列,共享内存.信号和线程高级操作 第十一章 消息队列 10.1消息队列定义 10.2 消息队列特点 10.3 key值 10.4 创建消息队列 10.4.1 发送消息 10.4. ...

  2. Linux进程间通信--消息队列(Message queuing)

    今天我们来谈一谈Linux进程间通信的方式之一消息队列 我们先来看看关于消息队列的定义: 1.消息队列是消息的链表,存放在内核中并由消息队列标识符表示. 2.消息队列提供了一个从一个进程向另一个进程发 ...

  3. linux下的zz命令,linux中cut命令的用法

    本文主要记录一下Linux中cut命令的用法. 1. cut命令使用说明 Usage: cut OPTION... [FILE]... cut命令用于选出FILE文件中每一行的某些部分,然后打印到标准 ...

  4. linux中ftp的用法,linux中的ftp命令用法(7页)-原创力文档

    第 第 PAGE 1 页 共 NUMPAGES 1 页 linux中的ftp命令用法 Linux系统中的ftp命令功能强大,那么它的具体用法是怎样呢?下面由小编为大家整理了linux中的ftp命令用法 ...

  5. python 消息队列 get是从队首还是队尾取东西_python分布式爬虫中消息队列知识点详解...

    当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...

  6. Linux中read命令的用法

    1. 简单读取 read命令接收标准输入(键盘)的输入或其他文件描述符的输入,得到输入后,read命令将数据放入一个标准变量中.下面是 read命令的最简单形式: bixiaopeng@bixiaop ...

  7. Linux中的ftp命令怎么写,linux中的ftp命令用法

    Linux系统中的ftp命令功能强大,那么它的具体用法是怎样呢?下面由学习啦小编为大家整理了linux中的ftp命令用法相关知识,希望对大家有帮助! linux中的ftp命令用法 1. 连接ftp服务 ...

  8. Linux中的cat命令用法

    linux中的cat有三种用法: -列举所有文件 -创建文件 -合并文件 详细请看: http://www.cnblogs.com/perfy/archive/2012/07/23/2605550.h ...

  9. linux的source命令,Linux中source命令的用法

    Linux中source命令的用法 Linux系统中,source命令通常用"."来代替,是一个点命令,与一般的命令有所不同,下面小编就给大家介绍下Linux中source命令的用 ...

最新文章

  1. js去空格的三种方法
  2. java int越界_用位运算判断int类型变量越界
  3. 质数c语言欧拉筛选,Python|欧拉筛法求质数
  4. 三菱PWM格式文件梯形图编码格式
  5. 谷歌新语言重写android,谷歌将推新设计语言 安卓APP用户界面将换新颜
  6. linux x和s 的区别,Hadoop1.x和2.X的HDFS fsimage和edits文件运行机制对比
  7. disconf-自动注入属性变化
  8. 设计模式 原型模式_原型设计模式:创建另一个小车
  9. tablestore列式存储原理_10分钟搞透:技术人必会的MySQL体系结构与存储引擎!
  10. 查询某个字段的记录是否包含中文或者是否是数字
  11. 5年5亿美金,华为昇腾如何争夺AI开发者?
  12. 修改docker内mysql配置后无法启动解决方法
  13. 课后作业3:软件与用户体验调查与分析
  14. 最强白嫖指南---推荐11个珍藏多年的网站!
  15. 入手kindle 3
  16. java 翻译 go语言_【翻译】go是面向对象语言吗?
  17. 江南爱软装十大品牌 提升格调的软装种类
  18. 联想电脑快捷键的使用和通用设置
  19. iOS 集成腾讯云聊天 最新sdk使用方法
  20. prim算法之处女作

热门文章

  1. win7彻底关闭windows更新
  2. 卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络
  3. 全国计算机二级真题第四套word,全国计算机二级office-word-历年真题
  4. 计算机在电影中的应用,谈计算机动画在电影特效中的应用
  5. myclub对阵计算机等级提示,TOPICS | PES - PRO EVOLUTION SOCCER 2019 Official Site
  6. 学校计算机老师干什么工作,关于计算机教师的个人工作总结
  7. 2017小学计算机功能室总结,音乐功能室的工作总结.docx
  8. c# wpf页面调用软键盘
  9. Robotaxi和车联网会擦出什么爱情火花?
  10. 大数据趣味学习探讨(一):学习框架的重要性