更多资料请点击:我的目录
本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢。

要求:
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就会同时退出

双进程有名管道通信应用实例相关推荐

  1. 双进程无名管道通信应用实例

    更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢. 要求: ①用pipe产生一个无名管道之后,再产生两个子进程A,B ②子进 ...

  2. C++有名管道通信简单示例

    有名管道,简单的理解可以理解成,一个通过命名不同来实现通信的一种方式. 简单的有名管道实现逻辑如下: * 1. CreateNamedPipe 创建一个有名管道,在系统中 * 2.::ConnectN ...

  3. c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...

    在将这个题目之前大家需要了解几个概念: 进程: 我们可以先看进程的定义:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础: ...

  4. linux下进程间管道通信,Linux下进程间通信方式-管道

    本文关键字: linux 管道通信,linux 进程通信方式,无名管道,有名管道 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入.Linux的管道主要包括两种:无 ...

  5. C#与C++进程间管道通信

    项目中需要将C++代码计算出的参数传递给C#代码做后续处理,就需要跨语言通信. 由于命名管道可以跨语言,跨平台,跨线程通信,实际上命名管道不仅可在同一台计算机的不同进程之间传输数据,甚至能在跨越一个网 ...

  6. Win Api 有名管道通信--扫雷辅助(四)

    有名管道的使用 同linux 下一样 通过有名管道 实现非父子进程(资源继承)关系的 进程间通信(Inter Process Communicate) 无名管道是通过内核进行内存共享 , 而有名管道是 ...

  7. linux两个子进程通信,Linux c 匿名管道实例—创建两个子进程与父进程进行管道通信...

    综合: 建立两个子进程: 一个负责计算1-50000的素数 另外一个负责计算50001-100000 父进程负责存储 利用fork创建两个子进程的框架: #include #include #incl ...

  8. 用户进程与内核进程通信netlink实例

    为了方便应用程序使用netlink接口,一个叫libnl库被开发. 1 下载libnl2  http://packages.ubuntu.com/oneiric/libnl2 2 下载libnl2-d ...

  9. 无名管道(PIPE)与 有名管道(FIFO)

    更多资料请点击:我的目录 本篇仅用于记录自己所学知识及应用,代码仍可优化,仅供参考,如果发现有错误的地方,尽管留言于我,谢谢. 无名管道(PIPE)部分: (1)无名管道的创建: 头文件: #incl ...

最新文章

  1. 如何打开写好的jpetstore
  2. 习题3-5 三角形判断 (15 分)
  3. rpm包 卸载php,强制删除rpm包的方法
  4. virtual方法(虚方法)与abstract(抽象方法)的区别
  5. 电脑工具栏怎么调整到下面_抖音怎么加字幕?如何制作短视频?
  6. idea package自动生成_懒人必备,IntelliJ IDEA中代码一键生成
  7. 如何使用idea快速创建SpringBoot项目
  8. 星地融合→→→6G移动通信关键技术的未来
  9. h710阵列卡支持最大硬盘_DELL服务器RAID磁盘阵列在线扩容(以H710P阵列卡为例)
  10. plsql删除大量数据_一次oracle大量数据删除经历
  11. 倒计时小工具_想要工作效率更高?这几款计时工具你一定不能错过!
  12. error LNK2001: 无法解析的外部符号 _ft_sdf_renderer_class/ _ft_bitmap_sdf_renderer_class
  13. Autobook中文版 (六)-- 8. Bootstrapping
  14. C++——STL容器
  15. JPEG编码压缩率调整
  16. 零基础微信小程序开发学习笔记(2.构建静态界面)
  17. r语言 柱状图加星号_R语言-柱状图
  18. 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(一起消消毒)
  19. 打猎游戏——HTML版(JavaScript的应用)
  20. 独立视频LED显示屏控制系统

热门文章

  1. react native 更换手机号 验证码输入框
  2. 不废话,分享一个我学习的捷径
  3. 【Unity3D开发小游戏】《打地鼠游戏》Unity开发教程
  4. 【Python入门教程】第36篇 可遍历对象与迭代器
  5. Linux vim 如何实现多行注释与取消多行注释
  6. ORA-00918: 未明确定义列(嵌套查询容易犯的错误)
  7. 网上采购android智能手机,在这里您可以订购 Sony Android智能手机
  8. uniapp实现支付功能
  9. 盘点那些你没怎么见过的手机软件,必不可少APP!
  10. [19保研]华东师范大学计算机科学技术系2018年优秀大学生夏令营通知