当前位置: 首页 > 编程日记 > 正文

linux进程间通信:消息队列实现双端通信

双端通信描述

利用消息队列针对发送接受消息的类型唯一性 进行多个客户端之间消息传递,而不需要server端进行消息转发。
同时消息队列的读阻塞和写阻塞特性(消息队列中已经写入数据,如果再不读出来,则无法再次写入)让消息队列的实现过程只能如下:

  • 客户端1的父进程用来处理类型1的消息写,子进程处理类型2的消息读
  • 客户端2的父进程处理类型2的消息写,子进程处理类型1的消息读

实现

客户端1 client1.c

#include<stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>#define MSG_TYPE1 1
#define MSG_TYPE2 2 struct msgbuf
{long mtype;char mtext[100];
};int main()
{//当多用户的时候通过指定文件以及设置id来获取唯一的key标识//key_t key = ftok(".",100);key_t key = 12345; //个人使用的时候可以直接指定key//创建msg_qid的对象int msg_qid = msgget(key, IPC_CREAT | 0666);struct msgbuf msg1,msg2;int ret;char send_buf[100],rcv_buf[100];ret = fork();if ( -1 == ret ) {printf("fork failed! \n");_exit(-1);}//子进程处理消息1的写else if (ret == 0) {while(1) {memset(&msg1, 0 , sizeof(msg1));//初始化消息类型以及消息内容scanf("%s",msg1.mtext);msg1.mtype = MSG_TYPE1;//发送消息到消息标识的msg_qid IPC 对象中/* if( -1 == msgsnd(msg_qid,(void *)&msg1,strlen(msg1.mtext),0)) {printf("send msg1 failed\n");_exit(-1);}*/msgsnd(msg_qid,(void *)&msg1,strlen(msg1.mtext),0);}}//父进程处理消息2的读else {while(1) { memset(&msg2, 0, sizeof(msg2));//获取消息大小为sizeof(msg2.mtext)if (-1 == msgrcv(msg_qid,(void*)&msg2,sizeof(msg2.mtext),MSG_TYPE2,0)){printf("receive msg2 failed\n");_exit(-1);} printf("client1:%s\n",msg2.mtext);}}msgctl(msg_qid,IPC_RMID,NULL);return 0;
}

客户端2 client2.c

#include<stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>#define MSG_TYPE1 1
#define MSG_TYPE2 2 struct msgbuf
{long mtype;char mtext[100];
};int main()
{//当多用户的时候通过指定文件以及设置id来获取唯一的key标识//key_t key = ftok(".",100);key_t key = 12345; //个人使用的时候可以直接指定key//创建msg_qid的对象int msg_qid = msgget(key, IPC_CREAT | 0666);struct msgbuf msg1,msg2;int ret;ret = fork();if ( -1 == ret ) {printf("fork failed! \n");_exit(-1);}else if (ret == 0) {while(1) {memset(&msg1, 0 , sizeof(msg1));//初始化消息类型以及消息内容scanf("%s",msg1.mtext);msg1.mtype = MSG_TYPE2;//发送消息到消息标识的msg_qid IPC 对象中/*if( -1 == msgsnd(msg_qid,(void *)&msg1,strlen(msg1.mtext),0)) {printf("send msg1 failed\n");_exit(-1);}*/msgsnd(msg_qid,&msg1,100,0);}}else {while(1) { memset(&msg2, 0, sizeof(msg2));if (-1 == msgrcv(msg_qid,(void*)&msg2,sizeof(msg2.mtext),MSG_TYPE1,0)){printf("receive msg2 failed\n");_exit(-1);} printf("client2:%s\n",msg2.mtext);}}msgctl(msg_qid,IPC_RMID,NULL);return 0;
}

编译运行输出如下:
在这里插入图片描述

消息队列相关命令
ipcs -q 查看系统消息队列
ipcrm -q msqid 按照消息标识删除当前用户下的消息队列
ipcmk -Q创建消息队列

消息队列相比于fifo的主要差异

差异:

  • 消息的改变,每个消息都有自己的身份标识
  • 内核提供访问消息结构的接口,并且提供结构来动态修改消息结构

共同点:
消息的接受和发送都是阻塞读和阻塞写,即需要将写的内容读出,否则下次发送会阻塞写

相关文章:

windows 软件安装事件_苹果安装windows,报windows支持软件未能存储到所选驱动器

今天去给一个IT外包客户维修电脑&#xff0c;前台的一台苹果电脑需要安装双系统&#xff0c;苹果电脑安装双系统对我们专业安装系统工程师来说&#xff0c;这不是很简单的嘛&#xff01;客户问需要多长时间&#xff0c;信心满的说一到两个小时&#xff01;客户说那你开始弄吧。…

C# Attribute简介

一 、EventAttribute有&#xff1a; BrowsableAttribute 、CategoryAttribute、DescriptionAttribute、DefaultEventAttribute PropertyAttribute有&#xff1a; BrowsableAttribute 、CategoryAttribute、DescriptionAttribute、 DefaultPropertyAttribute、DefaultValueAttri…

P2P之UDP穿透NAT的原理

关键词: P2P UDP NAT 原理 穿透 Traveral Symmetric Cone原始作者: Hwycheng Leo(FlashBTHotmail.com)源码下载: http://bbs.hwysoft.com/download/UDP-NAT-LEO.rar参考&#xff1a;http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt P2P之UDP穿透NAT的原理…

快速幂运算and 快速乘运算

ll qpow(ll a,ll b) {ll ans1;while(b){if(b&1) ans(ans*a)%mod;a(a*a)%mod;b>>1;}return ans; } 快速乘运算 ll mult(ll a,ll b,ll mod) {a%mod,b%mod;ll sa,sum0;while(b){if (b&1){sums;if (sum>mod)sum-mod;}b>>1;s<<1;if (s>mod)s-mod;}r…

linux进程间通信:system V 共享内存

文章目录思维导图如下通信原理优势运行流程编程接口编程实例思维导图如下 通信原理 多个进程共享物理内存的同一块区域&#xff08;通常称之为“段”:segment&#xff09;抛弃了内核态消息转存处理的过程&#xff0c;让两个进程直接通过一块内存进行通信 我们普通的像PIPE,FI…

python函数手册68_直接在python中检索68个内置函数?

Python 3.5中的一种方法是列出具有__module__属性的对象,并将其设置为builtins和lowercase name&#xff1a;>>> sorted(k for k, v in vars(__builtins__).items()if k.islower() and getattr(v, __module__, ) builtins)[__build_class__, __import__, abs, all, a…

《深入理解Java虚拟机》笔记3

垃圾收集算法 (1)标记清除 根据根搜索确定对象是否已死&#xff0c;已死对象标记&#xff0c;然后一起清除。 这个其实不算什么算法&#xff0c;最正常想法应该就是这样。但是&#xff0c;缺点 是效率不高&#xff0c;如果有很多不连续的小对象需要回收&#xff0c;会花好多时间…

Step-By-Step在AIX上安装Oracle RAC

最近遇到一个项目&#xff0c;是在AIX5.3上安装ORACLE 9i RAC&#xff0c;说实话&#xff0c;ORACLE俺压根就没有接触过&#xff0c;我也是临危受命。感觉如同当年实施AS400的XSM项目一般。无奈&#xff0c;下载了N多本REDBOOK开始研究&#xff0c;终于有了些眉目&#xff0c;找…

Python中输出字体的颜色设置

1.实现过程 终端的字符颜色是用转义序列控制的&#xff0c;是文本模式下的系统显示功能&#xff0c;和具体的语言无关。控制字符颜色的转义序列是以ESC开头,即用\033来完成 2.书写过程开头部分: \033[显示方式;前景色;背景色m结尾部分: \033[0m注意&#xff1a;开头部分的三个…

linux进程间通信:system V 信号量

文章目录概念描述通信原理编程接口使用流程编程案例概念描述 英文&#xff1a;semaphore 简称SEM&#xff0c;主要用来进行进程间同步本质&#xff1a;内核维护的一个正整数&#xff0c;可对其进行各种/-操作分类&#xff1a;systemV 信号量、POSIX 有名信号量、POSIX 无名信号…

设计模式总结1

1.代码不是没有错误就是最好的 &#xff08;1&#xff09;命名要规范-------取一个好的名字。 &#xff08;2&#xff09;代码少做无用功。 &#xff08;3&#xff09;注意逻辑错误。 &#xff08;4&#xff09;面向对象&#xff1a;可维护、可复用、可扩展、灵活性好。 2.简单…

mysql 单选字段_mysql字段类型

学习自 https://www.cnblogs.com/jennyyin/p/7895010.html&#xff0c;感谢原博主的奉献mysql支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、字符串、日期/时间。数值类型类型大小范围(有符号)范围(无符号)用途tinyint1字节(-128, 127)(0,255)小整数值smallint2字…

ios时间差,以时间格式显示

为什么80%的码农都做不了架构师&#xff1f;>>> NSDate *nowDate [[NSDate alloc]init]; double diffTime [nowDate timeIntervalSinceDate:preDate]; int diffHour diffTime / (60*60); int diffMin ( diffTime - diffHour*(60*60) ) / (60); int diffSec…

深入理解C++中public、protected及private用法

深入理解C中public、protected及private用法 这篇文章主要介绍了C中public、protected及private用法,对于C面向对象程序设计来说是非常重要的概念,需要的朋友可以参考下初学C的朋友经常在类中看到public&#xff0c;protected&#xff0c;private以及它们在继承中表示的一些访问…

v-vim 代码批量缩进,字符串精确查找及替换

vim中代码批量缩进 有如下两种办法&#xff0c;主要依靠>和<字符来进行 缩进的单位通过设置~/.vimrc,添加如下行 set tabstop4 "设定tab宽度为4个字符 set shiftwidth4 "设定自动缩进为4个字符 set expandtab "用space替代tab的输入 set noexpandtab &q…

Codeforces Round #228 (Div. 1)B

进制构造 这里用了十进制 有点像串并联 每一位代表的数分开表示出来再把每一位的数并起来 比如892 就是800902 800又可分为8*10*10。。。 1 #include <iostream>2 #include<cstdio>3 #include<cstring>4 #include<algorithm>5 #include<stdlib.h&g…

javaweb实现mysql备份功能_java web 实现mysql 数据库备份、恢复

如题&#xff0c;由于项目需要&#xff0c;研究并实现了java web的 mysql数据库的备份、下载、恢复功能&#xff0c;中间遇到一些问题&#xff0c;耗费了不少时间&#xff0c;下面让我一一道来&#xff1a;背景介绍&#xff1a;window 7系统mysql 5.7eclipsespring mvctomcat 7…

在windows8 上安装framework 3.5

在电脑上装了windows8 的双系统后&#xff0c;为了装上Windows Live Writer&#xff0c;需要安装framework3.5.在线安装等了很久都装不上&#xff0c;下载的安装包不能用&#xff0c;提示需要framework3.5的支持。死循环啊 。搜索找到离线更新的方法&#xff0c; 离线更新方法&…

C#第一章笔记

第一个C#程序 namespace 是C#中组织代码的方式&#xff0c;它的作用那个类似java中的包 using 在Java中作用如果导入其他包 应该是用import关键字而在C#中应使用using关键字来引用 class关键字 与java一样C#也是一门面向对象的得语言&#xff0c;使用class关键字来表示类 Main&…

linux进程间通信:system V 信号量和共享内存实现进程间同步

关于信号量和共享内存的相关描述已经在前几篇提到过&#xff1b; 信号量&#xff1a;即内核维护的一个正整数&#xff0c;可以使用内核提供的p/v接口进行该正整数的/-操作&#xff0c;它主要用来表示系统中可用资源的个数&#xff0c;协调各个进程有序访问资源&#xff0c;防止…

mysql三次握手_一文彻底搞懂 TCP三次握手、四次挥手过程及原理

原创文章首发于公众号&#xff1a;「码农富哥」&#xff0c;欢迎收藏和关注&#xff0c;如转载请注明出处&#xff01;TCP 协议简述TCP 提供面向有连接的通信传输&#xff0c;面向有连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。无论哪一方向另…

【转】常见系统中文字体的英文名

http://www.aoao.org.cn/blog/2008/03/fonts-chinese/ http://www.yale.edu/chinesemac/pages/fonts.html Mac OS的一些&#xff1a; 华文细黑&#xff1a;STHeiti Light [STXihei]华文黑体&#xff1a;STHeiti华文楷体&#xff1a;STKaiti华文宋体&#xff1a;STSong华文仿宋&…

手动新增swap分区

1、建立1G的交换分区&#xff08;填充&#xff09; #dd if /dev/zore of /opt/swapfile bs1M count1024 2、设置交换分区文件 #mkswap /opt/swapfile 3、立即启用交换分区文件 #swapon /opt/swapfile 4、系统开机时自动挂载新分区 #vim /etc/fstab 末尾添加&#xff1a;/opt…

js捕获和冒泡

面向对象&#xff1a; 1.单例模式 2.工厂模式 3.构造函数 &#xff08;1&#xff0c;2&#xff0c;3的目的都是生成对象&#xff09; js天生自带的类 object&#xff08;基类&#xff09; 子类&#xff1a;function&#xff08;函数&#xff09; array&#xff08;数组&…

linux进程间通信:system V 信号量 生产者和消费者模型编程案例

生产者和消费者模型&#xff1a; 有若干个缓冲区&#xff0c;生产者不断向里填数据&#xff0c;消费者不断从中取数据两者不冲突的前提&#xff1a; 缓冲区有若干个&#xff0c;且是固定大小&#xff0c;生产者和消费者各有若干个生产者向缓冲区中填数据前需要判断缓冲区是否满…

mysql类exadata功能_几类关系型数据库的数据解决方案

今天聊下几类关系型数据库的数据解决方案,算是抛砖引玉&#xff0c;近期也要对技术方向上做一些扩展&#xff0c;也算是前期的小结吧。13Oracle目前市面上的主流版本应该还是11gR2&#xff0c;记得很多年前有个网站做过一次调查&#xff0c;10g&#xff0c;11g的版本比例差不多…

ZOJ 2723 Semi-Prime ||ZOJ 2060 Fibonacci Again 水水水!

两题水题&#xff1a; 1.如果一个数能被分解为两个素数的乘积&#xff0c;则称为Semi-Prime&#xff0c;给你一个数&#xff0c;让你判断是不是Semi-Prime数。 2.定义F(0) 7, F(1) 11, F(n) F(n-1) F(n-2) (n>2) 让你判断第n项是否能被3整除。 1.ZOJ 2723 Semi-Prime ht…

Lua中的基本函数库

基本函数库为Lua内置的函数库&#xff0c;不需要额外装载assert (v [, message])功能&#xff1a;相当于C的断言&#xff0c;参数&#xff1a;v&#xff1a;当表达式v为nil或false将触发错误,message&#xff1a;发生错误时返回的信息&#xff0c;默认为"assertion failed…

Oracle中的substr()函数 详解及应用

1&#xff09;substr函数格式 (俗称&#xff1a;字符截取函数) 格式1&#xff1a; substr(string string, int a, int b); 格式2&#xff1a;substr(string string, int a) ; 解释&#xff1a; 格式1&#xff1a; 1、string 需要截取的字符串 2、a 截取字符串…

linux进程间通信:POSIX 消息队列

文章目录基本介绍相关编程接口编程实例消息队列通信实例消息队列属性设置实例基本介绍 关于消息队列的基本介绍&#xff0c;前面在学习system V的消息队列时已经有过了解&#xff0c;linux进程间通信&#xff1a;system V消息队列 支持不同进程之间以消息&#xff08;message…