我的代码


#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int f1(int x)
{if(x==1){return 1;}else{return f1(x-1)*x;}
}
int f2(int y)
{if(y ==1||y==2){return 1;}else{return f2(y-1)+f2(y-2);}
}
int main(int argc,char* argv[])
{int x,y;printf("Input x,y\n");scanf("%d %d",&x,&y);int pid1,pid2;int pipe1[2];int pipe2[2];int pipe3[2];int pipe4[2];if(pipe(pipe1)<0){printf("pipe1 error");}if(pipe(pipe2)<0){printf("pip2 error");}if(pipe(pipe3)<0){printf("pipe3 error");}if(pipe(pipe4)<0){printf("pipe4 error");  }if((pid1=fork())<0){perror("pipe not create");}else if(pid1==0) {close(pipe1[1]);close (pipe2[0]);int x1;read(pipe1[0],&x1,sizeof(int));int z=f1(x1);write(pipe2[1],&z,sizeof(int));close(pipe1[0]);close(pipe2[1]);exit(0);}else{//Father processif((pid2=fork())<0){perror("Process not create ");exit(EXIT_FAILURE);}else if(pid2==0){close(pipe3[1]);close(pipe4[0]);int y1;read(pipe3[0],&y1,sizeof(int));int z=f2(y1);write(pipe4[1],&z,sizeof(int));close(pipe3[0]);close(pipe4[1]);exit(0);}close(pipe1[0]);close(pipe2[1]);close(pipe3[0]);close(pipe4[1]);int z;write(pipe1[1],&x,sizeof(int));write(pipe3[1],&y,sizeof(int));read(pipe2[0],&x,sizeof(int));read(pipe4[0],&y,sizeof(int));z=x+y;printf("the result is %d\n",z);close(pipe1[1]);close(pipe2[0]);close(pipe3[1]);close(pipe4[0]);}return 0;
}

原理利用四个管道进行通信,注意管道是单向的,由父进程传x,y到子进程,同理子进程传相应结果;

相关资料

管道 pipe 是进程间通信最基本的一种机制,两个进程可以通过管道一个在管道
一端向管道发送其输出,给另一进程可以在管道的另一端从管道得到其输入.管道以
半双工方式工作,即它的数据流是单方向的.因此使用一个管道一般的规则是读管道
数据的进程关闭管道写入端,而写管道进程关闭其读出端.
1)pipe 系统调用的语法为:

#include <unistd.h>
int pipe(int pipe_id[2]);

如果 pipe 执行成功返回 0, pipe_id[0]中和 pipe_id[1]将放入管道两端的描述符.
出错返回-1.

操作系统-请编程建立 3 个并发协作进程,它们分别完成 f(x,y)、f(x)、f(y)相关推荐

  1. Java并发编程(一)——并发的基本概念

    Java并行程序基础 基本概念 并行计算的相关概念 同步(Synchronous)和异步(Asynchronous) 并发(Concurrent)和并行(Parallelism) 临界区 阻塞(Blo ...

  2. 并发编程-初级之认识并发编程

    并发编程-初级之认识并发编程 1.并发领域可以处理的问题 分工: 同步:分好工之后,就可以具体执行.任务之间是有依赖的,一个任务结束之后将去去通知后续的任务.java里面 Executor.Fork/ ...

  3. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    原文:学习ASP.NET Core Razor 编程系列十八--并发解决方案 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP. ...

  4. 操作系统——2.并发与进程

    文章目录 第二章 并发与进程 2.1 进程的概念 2.2 操作系统为控制程序所建立的数据结构 2.3 操作系统对进程的控制 2.4 线程 2.5 进程调度 2.6 实时系统与实时任务调度 2.7 并发 ...

  5. 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记

    <Java并发编程入门与高并发面试>or <Java并发编程与高并发解决方案>笔记 参考文章: (1)<Java并发编程入门与高并发面试>or <Java并发 ...

  6. Java线程详解(9)-并发协作

    Java线程:并发协作-生产者消费者模型 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一样,Hello World!都是最经典的例子. 实际上,准确说应 ...

  7. [19/04/11-星期四] 多线程_并发协作(生产者/消费者模式_2种解决方案(管程法和信号灯法))...

    一.概念 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型"生产者/消费者模式". Ø 什么是生产者? 生产者指的是负责生产数据的模 ...

  8. Linux原始网络编程,Linux操作系统网络编程 原始套接字 (1)

    Linux操作系统网络编程--原始套接字 (1) http://soft.zdnet.com.cn/software_zone/2007/1020/568223.shtml 我们在前面已经学习过了网络 ...

  9. 【操作系统】独立进程与协作进程

    独立进程与协作进程: 独立进程:不能影响或被系统内其他进程影响的进程,不与其它任何进程共享数据. 协作进程:能影响或被系统内执行的其他进程所影响的进程,与其他进程共享数据. 提供协作的好处: 信息共享 ...

最新文章

  1. OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort
  2. 【怎样写代码】参数化类型 -- 泛型(七):泛型方法
  3. Ubuntu上nfs的安装配置
  4. if for while until case select 命令
  5. linux命令窗口颜色,如何修改ssh命令行下登录时的颜色
  6. html5jqueryl轮播图,基于JQuery的实现图片轮播效果(焦点图)
  7. 最长上升子序列nlogn算法
  8. leetcode944
  9. docker安装tomcat下的日志查看
  10. 21.Phabricator 安装
  11. 函数:MySQL中取整函数round和floor
  12. python百度文库源码_Python源码剖析3
  13. 微信开放平台apk应用签名获取
  14. 基于ubuntu的ARM开发环境搭建
  15. 中国移动数据分析的七点经验
  16. 算法设计与分析复习--回溯法
  17. 如何看待互联网公司 996 现象,是种什么样的体验?
  18. java点到直线距离_求取点到直线的距离
  19. 工控随笔_10_西门子_WinCC的VBS脚本_01_基础入门
  20. 2010年5月27日俱乐部晚场活动,“iPhone应用成功经验分享”主题研讨活动

热门文章

  1. CVPR2020:Deep Unfolding Network for Image Super-Resolution 论文阅读笔记
  2. 用Tensorflow实现图片分类+详细注解
  3. 分离策略在趋势和盘整条件下的优化
  4. deepin20.1操作系统安装无线网卡驱动(8821ce)
  5. SEO—什么是长尾关键词、目标关键词,有什么区别,怎么分辨?
  6. PROE产品设计之骷髅头外观造型设计
  7. 第二周嵌入式课程总结
  8. 【java】家庭收支管理系统
  9. openGauss理事会筹备会圆满成功
  10. [Unity 架构] 更好的 Unity 游戏架构