消息队列的全双工通信
创建两个进程,使每个都能读写消息队列
代码:
msg_service.c
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>struct msgbuf
{long mtype;char mtest[128];char ID[4];
};int main()
{struct msgbuf sendbuf,readbuf;int msgid;key_t key;pid_t pid;int readret;key=ftok("b.c",5);msgid = msgget(key,0755|IPC_CREAT);if(msgid == -1){printf("create message queue failed!\n");return -1;}system("ipcs -q");printf("create message queue success msgid =%d\n",msgid);sendbuf.mtype=100;pid=fork();if(pid ==-1){printf("fork fail\n");return -1;}if(pid > 0)//父进程发送消息类型为100的消息给消息队列{while(1){memset(sendbuf.mtest,0,128);printf("please input to massage queue:\n");fgets(sendbuf.mtest,128,stdin);msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.mtest),0);}}if(pid == 0)//子进程从消息队列中读取消息类型为100的消息{while(1){memset(readbuf.mtest,0,128);readret=msgrcv(msgid,(void *)&readbuf,128,99,0);printf("receive byte form message queue is :%s\n",readbuf.mtest);printf("total have %d byte\n",readret);}}return 0;}
代码:
msg_client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>struct msgbuf
{long mtype;char mtest[128];char ID[4];
};int main()
{struct msgbuf sendbuf,readbuf;int msgid;key_t key;pid_t pid;int readret;key=ftok("b.c",5);msgid = msgget(key,0755|IPC_CREAT);if(msgid == -1){printf("create message queue failed!\n");return -1;}system("ipcs -q");printf("create message queue success msgid =%d\n",msgid);sendbuf.mtype=99;pid=fork();if(pid ==-1){printf("fork fail\n");return -1;}if(pid == 0)//子进程发送消息类型为99的消息给消息队列{while(1){//memset(sendbuf.mtest,0,128);printf("please input to massage queue:\n");fgets(sendbuf.mtest,128,stdin);msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.mtest),0);memset(sendbuf.mtest,0,128);}}if(pid > 0)//父进程读取消息类型为100的消息{while(1){memset(readbuf.mtest,0,128);readret=msgrcv(msgid,(void *)&readbuf,128,100,0);printf("receive byte form message queue is :%s\n",readbuf.mtest);printf("total have %d byte\n",readret);}}return 0;}```执行结果:
![请添加图片描述](https://img-blog.csdnimg.cn/65c4e9122a344698a4d6231e6b9d042d.png)
这时两个进程可进行通信。程序执行流程: msgsnd(msgid,(void *)&sendbuf,strlen(sendbuf.mtest),0);中最后的参数0表示,当消息返送完才返回,所以没有消息发送时,进程会一直卡在这,msgrcv(msgid,(void *)&readbuf,128,100,0);中最后一个参数0表示,若无消息函数一直阻塞,所以没有读取到消息时,函数也会一直卡在这。
消息队列的全双工通信相关推荐
- linux 消息队列的单工通信,半双工通信
目录 一 回顾 二 消息队列的单工通信 三 消息队列的半双工通信 一 回顾 1 通过 fgets函数实现输入指令 2 再通过 msgnsd 函数读取 值 3 最后通过 msgrcv函数获取 值 输出 ...
- php 多进程 消息队列,[PHP] 多进程通信-消息队列使用
向消息队列发送数据和获取数据的测试 $key=ftok(__file__,'a'); //获取消息队列 $queue=msg_get_queue($key,0666); //发送消息 //msg_se ...
- linux c之通过消息队列实现进程通信
1.消息队列的介绍 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的 ...
- 第15章 进程间通行 15.6 XSI IPC 15.7 消息队列
2019独角兽企业重金招聘Python工程师标准>>> 15.6 XSI IPC (1)3种称作XSI IPC的IPC是: 1)消息队列 2)信号量 3)共享存储器 (2)标识符和键 ...
- Linux进程间通讯之消息队列
首先有个大体的概念:http://www.xefan.com/archives/83703.html 头文件: #include <sys/ipc.h> #include <sys/ ...
- 进程间通信之消息队列
一.什么是消息队列 unix早期通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便.消息队列(也叫做报文队列)则克服了这些缺点. 消息队列就是一个消息 ...
- android自定义队列,Android 消息机制(一)消息队列的创建与循环的开始 Looper与MessageQueue...
写在前面 本文基于Android 7.1.1 (API 25)的源码分析编写 与之前的触摸事件分发机制分析的文章一样,Android系统机制的分析中关键的一环就是事件消息的处理.之前也说过,Andro ...
- 【共享内存】基于共享内存的无锁消息队列设计
上交所技术服务 2018-09-05 https://mp.weixin.qq.com/s/RqHsX3NIZ4_BS8O30KWYhQ 目录 一.背景 二.消息队列的应用需求 (一) 通信架构的升 ...
- 进程间通信的方式——信号、管道、消息队列、共享内存
进程间通信的方式--信号.管道.消息队列.共享内存 多进程: 首先,先来讲一下fork之后,发生了什么事情. 由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回 ...
最新文章
- 硅谷产学研的创新循环
- Know about RDBMS market share
- 【机器学习基础】Python机器学习入门指南(全)
- uni-app与Vue的区别
- 阶段1 语言基础+高级_1-2 -面向对象和封装_18定义一个标准的类
- ubuntu14.04 源
- 显示照片的RGB直方图
- 绿盟科技 linux漏洞,apache漏洞修复(绿盟科技漏洞)
- Python菜鸟编程第十四课之正则表达式
- 极客空间-MySQL实战45天-第四天
- iOS之加载Gif图片
- 利用python实现PSM
- pcd 地图转 栅格地图
- 5G和4G的区别到底在哪里?
- 将淘宝客数据导入自己的数据库
- Linux服务器管理记录
- 远程服务器连接的脚本,shell脚本连接并重启远程服务器的方法
- SAP中复制创建采购申请的过程
- Webdings,Wingdings图形字体对照表
- 在word上写博客直接发到CSDN