



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统实验报告线程和进/线程管道通信实验张咪 软件四班一、实验要求设有二元函数f(x,y)=f(x)+f(y)其中:f(x)=f(x-1)*x(x1)f(x)=1(x=1)f(y)=f(y-1)+f(y-2)(y2)f(y)=1(y=1,2)请编程建立3个并发协作进程,它们分别完成f(x,y)、f(x)、f(y)。二、实验目的通过Linux系统中线程和管道通信机制的实验,加深对于线程控制和管道通信概念的理解,观察和体验并发进/线程间的通信和协作的效果,练习利用无名管道进行进/线程间通信的编程和调试技术。三、实验环境实验环境均为Linux操作系统,开发工具为gcc和g+。四、实验思路要实现三个函数,要创建三个进程,两个子进程和一个父进程。一个子进程实现f(x),另一个实现f(y)。因为f(x,y)=f(x)+f(y),所以在父进程和子进程间建立通信,子进程将当前值传给父进程,父进程进行计算。而且由于父进程的f(x,y)中的x和f(x)中的x一一对应,所以这些进程应该同步的并发向前走,否则f(x,y)的值就是错的。五、算法设计1.创建进程,每个子进程的执行代码段实现对应函数功能。2.建立父进程和子进程间的通信。由于管道的读写默认的通信方式为同步读写方式,即如果管道读端无数据则读命令阻塞直到数据到达,反之如果管道写端有数据则写命令阻塞直到数据被读走。所以同步并发的问题可以通过管道实现。建立两个管道,pipe1和pipe2,f(x)通过pipe1向父进程写入f(x)的值。同理f(y)通过pipe2向父进程写入f(y)的值。父进程根据这两个值实现函数f(x,y)功能。六、实验过程:新建一个文件夹,在该文件夹中建立以下名为ppipe.c的C语言程序。编写代码,保存。输入gcc ppipe.c命令, 生成默认的可执行文件a.out。执行a.out:。执行并调试ppipe程序。七、调试及实验结果第一次编译时有很多拼写错误,错把perror打成prerror,不确定dowhile()语句的后面需不需要加分号,还漏掉了大括号,太粗心。一开始错把pipe0和pipe1理解为管道1和管道2,后来经过仔细阅读实验指导,知道pipe0和pipe1指的是管道两端。pipe系统调用的语法为: #include int pipe(int pipe_id2); pipe建立一个无名管道,pipe_id0中和pipe_id1将放入管道两端的描述符 如果pipe执行成功返回0。. 出错返回-1.八、源代码#include#include#includeint main(int argc,char *argv) int pid1,pid2;/两个子进程的进程号 int pipe12;/两个无名管道标号 int pipe22; int x=1,y=1; /如果创建管道失败,程序执行失败,退出 if(pipe(pipe1)0) perror(pipe1 创建不成功);exit(EXIT_FAILURE); if(pipe(pipe2)0)perror(pipe2 创建不成功);exit(EXIT_FAILURE); /创建子进程1 pid1=fork(); if(pid10)/如果子进程1创建失败,程序执行失败,退出perror(process1 创建不成功);exit(EXIT_FAILURE); else if(pid1=0)/子进程1创建成功 /要在管道1 的1端进行写操作 /将管道1的0端和管道2关闭close(pipe10);close(pipe20);close(pipe21); int fx=1;/fx的初始值 doif(x=1)fx=1;else fx=fx*x;/f(x)函数printf(child %d f(x):f(%d)=%dn,getpid(),x+,fx);write(pipe11,&fx,sizeof(int);/将fx的值取出写入管道1的1端 while(x=9);/一直计算到x=9close(pipe11);exit(EXIT_SUCCESS);/退出子进程1 else/父进程pid2=fork();/创建子进程2if(pid20)/如果子进程2创建失败,退出 perror(process2 not create); exit(EXIT_FAILURE); if(pid2=0)/成功创建子进程2 /要在管道2 的1端进行写操作 /将管道1 和管道2 的0端关闭 close(pipe10); close(pipe11); close(pipe20); int fy=1,fy1=1,fy2=1;/初始值 do if(y=1|y=2)fy=1; else fy1=fy2; fy2=fy; fy=fy1+fy2; /f(y)函数 printf(child %d f(y):f(%d)=%dn,getpid(),y+,fy); write(pipe21,&fy,sizeof(int);/将fy的值取出放入管道2的1端 while(y=9);/一直计算到y=9 close(pipe21); exit(EXIT_SUCCESS);/退出子进程2 else/父进程 /父进程要完成对管道1的0端和管道2的0端的读操作 /关闭管道1和管道2的1端close(pipe11);close(pipe21);int m=1,n=1; do read(pipe10,&x,sizeof(int); read(pipe20,&y,sizeof(int);printf(parent %d f(x,y)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水产品线上销售平台用户体验创新创业项目商业计划书
- 移动工作站GPU云渲染服务创新创业项目商业计划书
- 2025年恩施市残疾人联合会公益性岗位招聘考试笔试试题(含答案)
- 现场急救知识培训教案课件
- 2025年城市地下综合管廊运营社会稳定风险评估与风险控制报告
- 2025年汽车尾气排放检测技术市场发展趋势报告
- 2025年生鲜新零售供应链优化与冷链物流成本效益评估报告
- 2025年快时尚模式在时尚零售行业的供应链优化研究报告
- 2025年数字化教材在数学教育中的应用与教学效果研究
- 2025年教育行业教育培训机构教学效果评估与反馈研究报告
- 中山酒店行业状况分析
- 船员劳动合同
- 南城一中高三年级工作计划
- 企业重组改变组织结构以提高效率
- 植保无人机应急处置预案
- 湖北十堰生产实习报告
- 《中国古代的服饰》课件
- 行业标准项目建议书
- 新人教版高中数学选择性必修第一册全套精品课件
- 夏米尔350Pedm火花机快速入门操作
- 人教新版高中物理必修说课实验练习使用多用电表
评论
0/150
提交评论