1.消息队列原理


1、2…是消息类型,进程发送消息可以指定消息类型,进程接收消息也指定消息类型,这样在消息队列里识别消息类型就可以知道是不是自己需要接受的消息了。

2.消息队列示例代码

函数介绍

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
/*
msgget()创建或者获取一个消息队列
msgget()成功返回消息队列 ID,失败返回-1
msqflg: IPC_CREAT
*/
int msgget(key_t key, int msqflg);/*
msgsnd()发送一条消息,消息结构为:
struct msgbuf
{
long mtype; // 消息类型, 必须大于 0
char mtext[1]; // 消息数据
};
msgsnd()成功返回 0, 失败返回-1
msqsz: 指定 mtext 中有效数据的长度
msqflg:一般设置为 0 可以设置 IPC_NOWAIT//设置为0的话,消息队列添加满了,发送会阻塞。
*/
int msgsnd( int msqid, const void *msqp, size_t msqsz, int msqflg);/*
msgrcv()接收一条消息
msgrcv()成功返回 mtext 中接收到的数据长度, 失败返回-1
msqtyp: 指定接收的消息类型,类型可以为 0
msqflg: 一般设置为 0 可以设置 IPC_NOWAIT//设置为0,消息队列为空或者没有这类数据的话,会阻塞。
*/
ssize_t msgrcv( int msqid, void *msgp, size_t msqsz, long msqtyp, int msqflg);/*
msgctl()控制消息队列
msgctl()成功返回 0,失败返回-1
cmd: IPC_RMID
*/
int msgctl( int msqid, int cmd, struct msqid_ds *buf);

示例代码:wr.c进程随机发送消息类型为1、2的消息,进程 rd1.c 读取消息类型为1消息,进程rd2.c读取消息类型为 2的消息。wr.c退出的话,会先发送一条消息类型为1的数据“end”,再发送一条消息类型为 2的数据“end”,rd1和rd2分别读取,并退出,rd2.c程序里销毁消息队列 。
wr.c代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/msg.h>
#include<assert.h>typedef struct msgdata
{long mtype;char mtest[128];
}MsgData;int main()
{int msgid = msgget((key_t)1234,IPC_CREAT|0664);assert(msgid != -1);MsgData data;memset(&data,0,sizeof(data));char buff[128] = {0};while(1){printf("input:\n");fgets(buff,128,stdin);buff[strlen(buff)-1] = '\0';strcpy(data.mtest,buff);if(strncmp(buff,"end",3) == 0){data.mtype = 1;msgsnd(msgid, &data, 128,0);data.mtype = 2;msgsnd(msgid,&data,128,0);break;}data.mtype = rand()%2+1; msgsnd(msgid, &data, 128, 0);}exit(0);
}

rd1.c代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<assert.h>
#include<sys/msg.h>typedef struct msgdata
{long mtype;char mtext[128];
}MsgData;int main()
{int msgid = msgget((key_t)1234,IPC_CREAT|0664);assert(msgid != -1);MsgData data;memset(&data,0,sizeof(data));while(1){msgrcv(msgid,&data,128,1,0);if(strncmp(data.mtext,"end",3) == 0){break;}printf("data.typy:%d\n",data.mtype);printf("data.mtext:%s\n",data.mtext);}exit(0);
}

rd2.c代码:

include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<assert.h>
#include<sys/msg.h>typedef struct msgdata
{long mtype;char mtext[128];
}MsgData;int main()
{int msgid = msgget((key_t)1234,IPC_CREAT|0664);assert(msgid != -1);MsgData data;memset(&data,0,sizeof(data));while(1){msgrcv(msgid,&data,128,2,0);if(strncmp(data.mtext,"end",3) == 0){break;}printf("data.typy:%d\n",data.mtype);printf("data.mtext:%s\n",data.mtext);}msgctl(msgid,IPC_RMID,NULL);exit(0);
}

运行wr.c和rd1.c、rd2.c程序。
wr.c程序发送以下图中消息:

rd1.c程序运行结果:

rd2.c程序运行结果:

在这里,rd2.c里面对消息队列进行了销毁。
如果没在代码里操作销毁消息队列,可以 用命令ipcrm -q + msqid进行销毁。

进程间通信——消息队列相关推荐

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

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

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

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

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

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

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

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

  5. 210127阶段三进程间通信-消息队列

    目录 一.学习的知识点 1 回顾 1.1 1.2 2 进程间通信 2.1进程间通信的目的 2.2 进程间通信 2.2.1 消息队列 二.上课没有听懂或者没有理解的地方 三.当天学习的收获 一.学习的知 ...

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

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

  7. 【进程】进程间通信----消息队列

    文章目录 1.消息队列 2.特性 3.实现接口 4.消息队列进程间通信 5.消息队列和命名管道的区别 5.1 相同之处 5.2 消息队列的优势 6.消息队列组织图 1.消息队列 消息队列,就是一个消息 ...

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

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

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

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

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

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

最新文章

  1. Markdown使用文档
  2. 【版本工具】cvs,svn,git等版本工具区别
  3. springmvc常用5种注解_电线电缆工业中常用的5种线缆
  4. maya中英文对比_maya中英文对照表
  5. DP-访问者模式(Visitor Pattern)
  6. k8s核心技术-Helm引入---K8S_Google工作笔记0043
  7. 细说Linux链接文件类型
  8. [HDU4585]Shaolin
  9. hive表级权限控制_hive权限控制(一)
  10. ios python 越狱_如何使用Frida绕过iOS应用程序中的越狱检测!!!
  11. 解决某些MySQL数据库的表没了,建数据库也建不了的情况
  12. 陆奇天团二期成团,清北硕博超七成
  13. 微软必应词典客户端的案例分析
  14. C++难学吗?为什么难学?如何去学?
  15. 移动安全工具-dex2jar
  16. 看一遍就懂,详解java多线程——volatile
  17. KruskalAlgorithm(克鲁斯卡尔算法)
  18. linux之基础shell脚本编程1 基础变量赋值
  19. 仁润云丨网络小贷风控数据接口分析(多头借贷,芝麻信用)
  20. 【Lifelong learning】Achieving Forgetting Prevention and Knowledge Transfer in Continual Learning

热门文章

  1. 在log4j中使用自定义的Appender
  2. php写新闻浏览历史,PHP实现浏览历史记录
  3. Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中
  4. 【数据结构与算法】之深入解析“石子游戏II”的求解思路与算法示例
  5. 最长公共子序列Lcs 51Nod - 1006
  6. 11.1.1 JavaScript基本语法
  7. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1069:乘方计算
  8. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - F. 牌型种数
  9. 十六进制转double
  10. Linux 内核中的 cdev_alloc和cdev_add