双进程有名管道通信应用实例
更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。
要求:
p1和p2两个进程通信,用有名管道实现
需要两个管道文件
第一个管道 p1写入,p2读取,第二个管道 p2写入,p1读取
p1写入数据
p2把读到的数据做简单处理后返回给p1,反之亦然
所谓的简单处理: 如p1写入"123456",p2收到之后,反馈给p1 “received:123456”
p1收到该反馈信息后,会和之前的信息确认,没有错误才发送下一个信息
P1部分:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>int main()
{int ret;if(access("/home/gec/jiajia/1.txt",F_OK)) //判断文件是否存在,固定参数F_OK{ret = mkfifo("/home/gec/jiajia/1.txt",0666); //不存在则创建if(ret == -1){perror("创建有名管道失败!\n");return -1;}}int fifo1 = open("/home/gec/jiajia/1.txt",O_RDWR); //存在就直接打开if(fifo1 == -1){perror("打开有名管道1失败!\n");return -1;}if(access("/home/gec/jiajia/2.txt",F_OK)) //判断文件是否存在,固定参数F_OK{ret = mkfifo("/home/gec/jiajia/2.txt",0666); //不存在则创建if(ret == -1){perror("创建有名管道失败!\n");return -1;}}int fifo2 = open("/home/gec/jiajia/2.txt",O_RDWR); //存在就直接打开if(fifo2 == -1){perror("打开有名管道2失败!\n");return -1;}char buf1[50];char buf2[50];char receive_buf[60];char fix_buf[50];int flag = 0;int flag1 = 0;int flag2 = 0;while(1){ if(flag1 == 0){bzero(buf1,50);printf("\nP1输入:");scanf("%s",buf1);write(fifo1, buf1 ,50); //从有名管道1中写入内容flag1 = 1;}bzero(buf2,50);read(fifo2, buf2 ,50); //从有名管道2中读取内容if(strcmp(buf2,"exit")==0) //判断是否接收到exit{write(fifo1, buf2 ,50); //从有名管道1中写入exitbreak; //退出循环}printf("\nP1输出:%s\n",buf2);if(++flag2 >1){flag1 = 0;flag2 = 0;}if(strstr(buf2,":")!=NULL) //判断是否接收到拼接字符串{bzero(fix_buf,60);for(int j = 0; j < strlen(buf2)-8;j++){fix_buf[j] = buf2[8+j]; //获取":"后的字符串}flag = 1;}if(flag == 0){bzero(receive_buf,50);sprintf(receive_buf,"%s%s","receive:",buf2);write(fifo1, receive_buf,50); //从有名管道1中写入内容}if(flag == 1){if(strcmp(fix_buf,buf1) != 0) //判断":"后的字符串是否与刚输入的字符串相同{printf("信息有误!\n\n");}else {printf("信息无误!\n\n");}flag = 0 ;} }close(fifo1); //关闭有名管道1文件close(fifo2); //关闭有名管道2文件return 0;
}
P2部分
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>int main()
{int ret;if(access("/home/gec/jiajia/1.txt",F_OK)) //判断文件是否存在,固定参数F_OK{ret = mkfifo("/home/gec/jiajia/1.txt",0666); //不存在则创建if(ret == -1){perror("创建有名管道失败!\n");return -1;}}int fifo1 = open("/home/gec/jiajia/1.txt",O_RDWR); //存在就直接打开if(fifo1 == -1){perror("打开有名管道1失败!\n");return -1;}if(access("/home/gec/jiajia/2.txt",F_OK)) //判断文件是否存在,固定参数F_OK{ret = mkfifo("/home/gec/jiajia/2.txt",0666); //不存在则创建if(ret == -1){perror("创建有名管道失败!\n");return -1;}}int fifo2 = open("/home/gec/jiajia/2.txt",O_RDWR); //存在就直接打开if(fifo2 == -1){perror("打开有名管道2失败!\n");return -1;}char buf1[50];char buf2[50];char receive_buf[60];char fix_buf[50];int flag = 0;int flag1 = 0;int flag2 = 0;while(1){if(flag1 == 1){bzero(buf1,50);printf("\nP2输入:");scanf("%s",buf1);write(fifo2, buf1 ,50); //从有名管道1中写入内容flag1 = 0;}bzero(buf2,50);read(fifo1, buf2 ,50); //从有名管道2中读取内容if(strcmp(buf2,"exit")==0) //判断是否接收到exit{write(fifo2, buf2 ,50); //从有名管道1中写入内容break;}printf("\nP2输出:%s\n",buf2); if(strstr(buf2,":")!=NULL) //判断是否接收到拼接字符串{bzero(fix_buf,60);for(int j = 0; j < strlen(buf2)-8;j++){fix_buf[j] = buf2[8+j]; //获取":"后的字符串}flag = 1;}if(flag == 0){bzero(receive_buf,50);sprintf(receive_buf,"%s%s","receive:",buf2);write(fifo2, receive_buf,50); //从有名管道1中写入内容flag1 = 1;}if(flag == 1){if(strcmp(fix_buf,buf1) != 0) //判断":"后的字符串是否与刚输入的字符串相同{printf("信息有误!\n\n");}else {printf("信息无误!\n\n");}flag = 0 ;} }close(fifo1); //关闭有名管道1文件close(fifo2); //关闭有名管道2文件return 0;
}
运行结果:随意一方输入exit,P1\P2就会同时退出
双进程有名管道通信应用实例相关推荐
- 双进程无名管道通信应用实例
更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢. 要求: ①用pipe产生一个无名管道之后,再产生两个子进程A,B ②子进 ...
- C++有名管道通信简单示例
有名管道,简单的理解可以理解成,一个通过命名不同来实现通信的一种方式. 简单的有名管道实现逻辑如下: * 1. CreateNamedPipe 创建一个有名管道,在系统中 * 2.::ConnectN ...
- c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...
在将这个题目之前大家需要了解几个概念: 进程: 我们可以先看进程的定义:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础: ...
- linux下进程间管道通信,Linux下进程间通信方式-管道
本文关键字: linux 管道通信,linux 进程通信方式,无名管道,有名管道 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入.Linux的管道主要包括两种:无 ...
- C#与C++进程间管道通信
项目中需要将C++代码计算出的参数传递给C#代码做后续处理,就需要跨语言通信. 由于命名管道可以跨语言,跨平台,跨线程通信,实际上命名管道不仅可在同一台计算机的不同进程之间传输数据,甚至能在跨越一个网 ...
- Win Api 有名管道通信--扫雷辅助(四)
有名管道的使用 同linux 下一样 通过有名管道 实现非父子进程(资源继承)关系的 进程间通信(Inter Process Communicate) 无名管道是通过内核进行内存共享 , 而有名管道是 ...
- linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...
综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...
- 用户进程与内核进程通信netlink实例
为了方便应用程序使用netlink接口,一个叫libnl库被开发. 1 下载libnl2 http://packages.ubuntu.com/oneiric/libnl2 2 下载libnl2-d ...
- 无名管道(PIPE)与 有名管道(FIFO)
更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢. 无名管道(PIPE)部分: (1)无名管道的创建: 头文件: #incl ...
最新文章
- 如何打开写好的jpetstore
- 习题3-5 三角形判断 (15 分)
- rpm包 卸载php,强制删除rpm包的方法
- virtual方法(虚方法)与abstract(抽象方法)的区别
- 电脑工具栏怎么调整到下面_抖音怎么加字幕?如何制作短视频?
- idea package自动生成_懒人必备,IntelliJ IDEA中代码一键生成
- 如何使用idea快速创建SpringBoot项目
- 星地融合→→→6G移动通信关键技术的未来
- h710阵列卡支持最大硬盘_DELL服务器RAID磁盘阵列在线扩容(以H710P阵列卡为例)
- plsql删除大量数据_一次oracle大量数据删除经历
- 倒计时小工具_想要工作效率更高?这几款计时工具你一定不能错过!
- error LNK2001: 无法解析的外部符号 _ft_sdf_renderer_class/ _ft_bitmap_sdf_renderer_class
- Autobook中文版 (六)-- 8. Bootstrapping
- C++——STL容器
- JPEG编码压缩率调整
- 零基础微信小程序开发学习笔记(2.构建静态界面)
- r语言 柱状图加星号_R语言-柱状图
- 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(一起消消毒)
- 打猎游戏——HTML版(JavaScript的应用)
- 独立视频LED显示屏控制系统
热门文章
- react native 更换手机号 验证码输入框
- 不废话,分享一个我学习的捷径
- 【Unity3D开发小游戏】《打地鼠游戏》Unity开发教程
- 【Python入门教程】第36篇 可遍历对象与迭代器
- Linux vim 如何实现多行注释与取消多行注释
- ORA-00918: 未明确定义列(嵌套查询容易犯的错误)
- 网上采购android智能手机,在这里您可以订购 Sony Android智能手机
- uniapp实现支付功能
- 盘点那些你没怎么见过的手机软件,必不可少APP!
- [19保研]华东师范大学计算机科学技术系2018年优秀大学生夏令营通知