操作系统-请编程建立 3 个并发协作进程,它们分别完成 f(x,y)、f(x)、f(y)
我的代码
#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)相关推荐
- Java并发编程(一)——并发的基本概念
Java并行程序基础 基本概念 并行计算的相关概念 同步(Synchronous)和异步(Asynchronous) 并发(Concurrent)和并行(Parallelism) 临界区 阻塞(Blo ...
- 并发编程-初级之认识并发编程
并发编程-初级之认识并发编程 1.并发领域可以处理的问题 分工: 同步:分好工之后,就可以具体执行.任务之间是有依赖的,一个任务结束之后将去去通知后续的任务.java里面 Executor.Fork/ ...
- 学习ASP.NET Core Razor 编程系列十八——并发解决方案
原文:学习ASP.NET Core Razor 编程系列十八--并发解决方案 学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP. ...
- 操作系统——2.并发与进程
文章目录 第二章 并发与进程 2.1 进程的概念 2.2 操作系统为控制程序所建立的数据结构 2.3 操作系统对进程的控制 2.4 线程 2.5 进程调度 2.6 实时系统与实时任务调度 2.7 并发 ...
- 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记
<Java并发编程入门与高并发面试>or <Java并发编程与高并发解决方案>笔记 参考文章: (1)<Java并发编程入门与高并发面试>or <Java并发 ...
- Java线程详解(9)-并发协作
Java线程:并发协作-生产者消费者模型 对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一样,Hello World!都是最经典的例子. 实际上,准确说应 ...
- [19/04/11-星期四] 多线程_并发协作(生产者/消费者模式_2种解决方案(管程法和信号灯法))...
一.概念 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型"生产者/消费者模式". Ø 什么是生产者? 生产者指的是负责生产数据的模 ...
- Linux原始网络编程,Linux操作系统网络编程 原始套接字 (1)
Linux操作系统网络编程--原始套接字 (1) http://soft.zdnet.com.cn/software_zone/2007/1020/568223.shtml 我们在前面已经学习过了网络 ...
- 【操作系统】独立进程与协作进程
独立进程与协作进程: 独立进程:不能影响或被系统内其他进程影响的进程,不与其它任何进程共享数据. 协作进程:能影响或被系统内执行的其他进程所影响的进程,与其他进程共享数据. 提供协作的好处: 信息共享 ...
最新文章
- OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort
- 【怎样写代码】参数化类型 -- 泛型(七):泛型方法
- Ubuntu上nfs的安装配置
- if for while until case select 命令
- linux命令窗口颜色,如何修改ssh命令行下登录时的颜色
- html5jqueryl轮播图,基于JQuery的实现图片轮播效果(焦点图)
- 最长上升子序列nlogn算法
- leetcode944
- docker安装tomcat下的日志查看
- 21.Phabricator 安装
- 函数:MySQL中取整函数round和floor
- python百度文库源码_Python源码剖析3
- 微信开放平台apk应用签名获取
- 基于ubuntu的ARM开发环境搭建
- 中国移动数据分析的七点经验
- 算法设计与分析复习--回溯法
- 如何看待互联网公司 996 现象,是种什么样的体验?
- java点到直线距离_求取点到直线的距离
- 工控随笔_10_西门子_WinCC的VBS脚本_01_基础入门
- 2010年5月27日俱乐部晚场活动,“iPhone应用成功经验分享”主题研讨活动