欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    山大操作系统实验2(4页).doc

    • 资源ID:43102466       资源大小:126KB        全文页数:4页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    山大操作系统实验2(4页).doc

    -山大操作系统实验2-第 4 页操作系统实验报告线程和进/线程管道通信实验张咪 软件四班一、实验要求设有二元函数f(x,y) = f(x) + f(y) 其中:  f(x) = f(x-1) * x       (x >1)         f(x)=1               (x=1)          f(y) = f(y-1) + f(y-2)   (y> 2)         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 <unistd.h> int pipe(int pipe_id2); pipe建立一个无名管道,pipe_id0中和pipe_id1将放入管道两端的描述符 如果pipe执行成功返回0。. 出错返回-1.八、源代码#include<stdio.h>#include<unistd.h>#include<stdlib.h>int 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(pid1<0)/如果子进程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(pid2<0)/如果子进程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);/退出子进程2else/父进程 /父进程要完成对管道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):f(%d,%d)=%dn",getpid(),m+,n+,x+y); while(m<=9&&n<=9);/一直计算到x=9,y=9 close(pipe10); close(pipe20); return EXIT_SUCCESS;/执行成功退出

    注意事项

    本文(山大操作系统实验2(4页).doc)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开