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

2.消息队列提供了一个从一个进程向另一个进程发送数据块的方法,每个数据块都可以被认为是有一个类型,接受者接受的数据块可以有不同的类型。但是同管道类似,它有一个不足就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数(MSGMNB),系统上消息队列的总数上限(MSGMNI)。可以用cat /proc/sys/kernel/msgmax查看具体的数,据。

我用自己的话总结一下就是这是一个类似管道的通信方式,但是可以双向通信,而且消息队列不会随进程执行完毕而消失,消息队列的生命周期随内核,我们可以手动关闭。

简单概述一下应用场景:
接收端发送端拥有相同的消息队列的ID号,当接收端执行程序后进入阻塞状态,等待服务端发送消息,发送端发送消息进入消息队列后,接收端打开阻塞,并向消息队列发送我已经收到消息的字符串,发送端再从消息队列中接收

介绍一下用到的api:
1.msgget
原型是

int msgget(key_t key, int msgflag);

第一个参数是消息队列的ID号,第二个是权限,一般我们用若无则创建+可读可写方式
比如

int msgID=msgget(key,IPC_CREAT|0777);

其中key的值我们通过ftok这api得到
2.ftok
key_t ftok( char * fname, int id )
fname就时你指定的文件名,id是子序号。
在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。
如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。
代码示例:

key_t key;
key =ftok(".",'1');

3.msgsnd
原型:

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

第一个参数是ID号,第二个是你要发送的东西,第三个是发多少大小,第四个默认为0.
返回值,成功为0,失败为-1
示例:

msgsnd(msgID,&sendBuf,strlen(sendBuf.mtext),0);

4.msgrcv
原型:

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

第三个参数就是消息队列结构体里面的mtype其余与msgsnd相同
示例:

msgrcv(msgID,&readBuf,sizeof(readBuf.mtext),888,0);

5.msgctl
原型:
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
第一个参数ID号,第二个执行什么命令,第三个我们一般用NULL
cmd有三种:

  1. IPC_STAT 把msqid_ds结构中的数据设置为消息队列的当前关联值
  2. IPC_SET 在进程有足够权限的前提下,把消息队列的当前关联值设置为msqid_ds数据结构中给出的值
  3. IPC_RMID 删除消息队列

示例:

msgctl(msgID,IPC_RMID,NULL);

以上就是关于消息队列api的介绍

接下来我们来看一下代码
首先是接收端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>struct msgbuf{long mtype;char mtext[128];};int main()
{struct msgbuf readBuf;key_t key;key =ftok(".",'1');printf("key=%x\n",key);int msgID=msgget(key,IPC_CREAT|0777);if(msgID == -1){printf("get mq  error!\n");}msgrcv(msgID,&readBuf,sizeof(readBuf.mtext),888,0);printf("read from mq :%s\n",readBuf.mtext);struct msgbuf sendBuf = {900,"I'm get message"};msgsnd(msgID,&sendBuf,strlen(sendBuf.mtext),0);msgctl(msgID,IPC_RMID,NULL);//删除消息队列return 0;
}
~

然后是发送端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/msg.h>struct msgbuf{long mtype;char mtext[128];};int main()
{key_t key;key =ftok(".",'1');printf("key=%x\n",key);struct msgbuf sendBuf = {888,"this is message from mq"};int msgID=msgget(key,IPC_CREAT|0777);if(msgID == -1){printf("get mq  error!\n");}msgsnd(msgID,&sendBuf,strlen(sendBuf.mtext),0);struct msgbuf readBuf;msgrcv(msgID,&readBuf,sizeof(readBuf.mtext),900,0);printf("read from mq return:%s\n",readBuf.mtext);msgctl(msgID,IPC_RMID,NULL);return 0;
}
~

我们看一下运行的结果

可以看到接收端进入阻塞状态,接下来我们运行发送端。

可以看到接收端收到消息,发送端也收到了接收端的回应。

以上就是关于Linux进程间通信–消息队列的介绍,尚有不足之处,请各位大神指正。

salute CLC

Linux进程间通信--消息队列(Message queuing)相关推荐

  1. Linux IPC 进程间通信——消息队列message

    消息队列是消息的连接表,存储在内核中.本实例主要实现消息队列方式进行进程间通信,接收端收到消息之后,立马转发给发送端:发送端发出消息之后,立马监听接收端回馈的消息,实现一个双向通信示例. 一.示例 发 ...

  2. linux 消息对lie_详解linux进程间通信-消息队列

    前言:前面讨论了信号.管道的进程间通信方式,接下来将讨论消息队列. 一.系统V IPC 三种系统V IPC:消息队列.信号量以及共享内存(共享存储器)之间有很多相似之处. 每个内核中的 I P C结构 ...

  3. Linux进程间通信——消息队列

    2019独角兽企业重金招聘Python工程师标准>>> 下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章 ...

  4. linux进程间通信--消息队列相关函数(ftok)详解

    ftok 消息队列.信号灯.共享内存常用在Linux服务端编程的进程间通信环境中.而此三类编程函数在实际项目中都是用System V IPC函数实现的.System V IPC函数名称和说明如下表15 ...

  5. Linux的进程间通信-消息队列

    Linux的进程间通信-消息队列 微博ID:orroz 微信公众号:Linux系统技术 前言 Linux系统给我们提供了一种可以发送格式化数据流的通信手段,这就是消息队列.使用消息队列无疑在某些场景的 ...

  6. 进程间通信——消息队列(Message queue)

    在Linux中,IPC消息队列是一个双向通信的全内存设计,即内核保证了读写顺序和数据同步,并且是性能比较好的先进先出的数据结构.消息队列的应用场景:比如异步任务处理,抢占式的数据分发,顺序缓存区等. ...

  7. 消息队列-Message Queue

    消息队列-Message Queue 目前随着互联网的普及以及上网用户的增多,拥有一套 安全.稳定.低耦合.高性能的内部通信工具尤为重要. 什么是消息队列? 消息队列(英语:Message queue ...

  8. 消息队列(Message Query)的初学习

    消息队列(Message Query)的初学习   摘要:本篇笔记主要记录了对于消息队列概念的初次学习.消息队列的基础知识. 文章目录 消息队列(Message Query)的初学习 1.何为消息? ...

  9. 【Linux系统编程】进程间通信--消息队列

    概述 消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法,其特点如下: 1)消息队列可以实现消息的随机查询.消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取. 2)消息队列允 ...

最新文章

  1. 利用Apache的ab命令做Benchmark性能测试
  2. tensorflow tf.data.TextLineDataset()对象 (包含来自一个或多个文本文件的行的“数据集”) 不懂是啥玩意??
  3. 护士计算机等级考试报名时间2015,湖南大学2015年9月全国计算机等级考试报名时间...
  4. 浏览器缓存问题原理以及解决方案
  5. Node.js v11.0 正式发布!
  6. c/c++ 求字符数组长度(非所占内存大小)
  7. 从两个模型带你了解DAOS 分布式异步对象存储
  8. kafka实时日志处理
  9. 递归算法设计 —— 选择排序和冒泡排序
  10. 区块链隐私保护:技术和相关项目
  11. 一键重启tomcat
  12. Objective-C JSON字符串解析
  13. PF_PACKET说开去
  14. rust启动错误ple_Rust 错误处理
  15. 【干货】如何利用 pandas 批量合并 Excel?
  16. dva model数据管理
  17. Android第三方支付
  18. html盒子整体向下移动,盒子上下左右居中方法全(持续更新中)
  19. 我是这样教《雨巷》的
  20. python解决迅雷下载限制的方法

热门文章

  1. ERP的五大核心思想
  2. java linux 微软雅黑_Linux下安装宋体以及微软雅黑字体
  3. 2021宿迁所有高中高考成绩查询,宿迁市“赫赫有名”的4所高中,高考成绩说话,不愧是211后援团...
  4. 计算机网络综合组网实验、综合组网实验
  5. Spring 的控制反转/依赖注入
  6. 认识消防报警联网中CAN光纤转换器的光纤接口和配套光纤线缆
  7. 投资银行业务财务报表分析
  8. 什么?你还没妹子?教你如何借助Python俘获女孩子芳心
  9. 爱站网关键词挖掘工具-长尾关键词挖掘站长工具
  10. 雷电模拟器忘记锁屏密码【已解决】