电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOCX文档下载
分享到微信 分享到微博 分享到QQ空间

操作系统实验三进程的管道通信

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

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

操作系统实验三进程的管道通信

实验三进程的管道通信一、实验目的:(1)加深对进程概念的理解,明确进程和程序的区别;(2)学习进程创建的过程,进一步认识并发执行的实质;(3)分析进程争用资源的现象,学习解决进程互斥的方法;(4)学习解决进程同步的方法;(5)掌握Linux系统进程间通过管道通信的具体实现方法。二、实验内容及要求:(1)使用系统调用pipe()建立一条管道线,两个子进程分别向管道写一句话(写的内容自己定,但要有该进程的一些信息);(2)父进程从管道中读出来自两个子进程的消息,显示在屏幕上;(3)要求:父进程首先接收子进程p1发来的消息,然后再接收子进程p2发来的消息;(4)两个子进程要并发执行;(5)实现管道的互斥使用。当一个子进程正在对管道进行写操作时,另一个欲写入管道的子进程必须等待。使用系统调用lockf(fd1,1,0)实现对管道的加锁操作,用lockf(fd1,0,0)解除对管道的锁定;(6)实现父子进程的同步,当父进程试图从一空管道中读取数据时,便进入等待状态,直到子进程将数据写入管道返回后,才将其唤醒。三、实现:相关的系统调用fork()用于创一个子进程。格式:intfork();返回值:在子进程中返回0;在父进程中返回所创建的子进程的ID值;当返回-1时,创建失败。wait()常用来控制父进程与子进程的同步。在父进程中调用wait(),则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,父进程从wait()返回继续执行原来的程序。返回值:大于0时,为子进程的ID值;等于-1时,调用失败。exit()是进程结束时最常调用的。格式:voidexit(intstatus);其中,status为进程结束状态。pipe()用于创建一个管道格式:pipe(intfd);其中fd是一个由两个数组元素fd和fd1组成的整型数组,fd是管道的读端口,用于从管道读出数据,fd1是管道的写端口,用于向管道写入数据。返回值:0调用成功;-1调用失败。sleep()使调用进程睡眠若干时间,之后唤醒。格式:sleep(intt);其中t为睡眠时间。lockf()用于对互斥资源加锁和解锁。在本实验中该调用的格式为:lockf(fd1,1,0);/*表示对管道的写入端口加锁。lockf(fd1,0,0);/*表示对管道的写入端口解锁。write(fd1,String,Length)将字符串String的内容写入管道的写入read(fd0,String,Length)从管道的读入口读出信息放入字符串String中。程序流程图父进程新站化创建智道创捏干进播Pt府指百道消县图1父进程流程图四、运行结果及说明图2子进程P1流程图fos_tst3pidl=3315pldl=OPid2=3318-二pid2=0Pid3=3317二三七TheChildprocess2icsendirigmessage>二三TheChiIdprocess1sending同ess日ge!pid3=O"'TheChildprocess3issendir9messageIThisisthechild2process's晚wage!Thisisthechild3pracexs'smessageIThisisthechild1process'snescage!Processreturned0(0x0)executiontimei3*002sPressENTERtocontinue*Agos_tst3pidl=2969pidl=OTheChiIdprocess1issendingmessage!Pid2=2970Pid2-0Pid3=2971TheChiIdprocess2issendingmessageIpid3=0TheChiIdprocess3issendingmessageIThisisthechild1processesmessage!Thisisthechild2process'smessage!Thisisthechild3process'smessage!Processreturned0(0x0)executiontime:3*004sPressENTERtocontinue.五、源代码#include<stdio.h>#include<sys/types.h>#include<stdlib.h>#include<sys/stat.h>#include<fcntl.h>#include<error.h>#include<wait.h>#include<unistd.h>intmain()intpid1,pid2,pid3;intfd2;charoutpipe60,inpipe60;pipe(fd);/创建一个管道while(pid1=fork()=-1);printf("pid1=%dn",pid1);if(pid1=0)printf("TheChildprocess1issendingmessage!n");lockf(fd1,1,0);/互斥sprintf(outpipe,"Thisisthechild1process'smessage!n");write(fd1,outpipe,60);sleep(1);/自我阻塞1秒,让出机会执行下一个进程,增加并发lockf(fd1,0,0);exit(0);elsewhile(pid2=fork()=-1);printf("pid2=%dn",pid2);if(pid2=0)printf("TheChildprocess2issendingmessage!n");lockf(fd1,1,0);sprintf(outpipe,"Thisisthechild2process'smessage!n");write(fd1,outpipe,60);sleep(1);lockf(fd1,0,0);exit(0);elsewhile(pid3=fork()=-1);printf("pid3=%dn",pid3);if(pid3=0)printf("TheChildprocess3issendingmessage!n");lockf(fd1,1,0);sprintf(outpipe,"Thisisthechild3process'smessage!n");write(fd1,outpipe,60);sleep(1);lockf(fd1,0,0);exit(0);elsewait(0);/同步read(fd0,inpipe,60);printf("n%s",inpipe);wait(0);read(fd0,inpipe,60);printf("%sn",inpipe);wait(0);read(fd0,inpipe,60);printf("%sn",inpipe);exit(0);return0;六、回答问题(1)指出父进程与两个子进程并发执行的顺序,并说明原因。子进程先执行,然后父进程才执行。这是由进程的同步机制决定的,因为只有子进程向管道中写入信息后,父进程才能读取;否则父进程自己调用wait()系统调用将自己阻塞,将处理机交由子进程。(2)若不对管道加以互斥控制,会有什么后果?管道进行互斥控制,是为防止两个子进程对管道资源进行争夺而产生信息丢失或覆盖。如果不加控制,那么可能一个子进程写入的信息还没来得及被父进程读出,另一个子进程又先写入信息,那么之前的进程写入的信息将被覆盖,父进程也就读不到之前进程传递来的信息了。(3)说明你是如何实现父子进程之间的同步的。1、父进程读出之前确定管道中有数据,否则阻塞自己。这一点很容一般到,通过系统调用wait()函数,即可以实现,当子进程结束时父进程才执行,那么此时管道中肯定已经有子进程写入的数据了。2、子进程在写入之前要确定管道中的数据已经被父进程读出,否则不能写入或者阻塞自己。3、这可以通过进程间的互斥来间接的办到。因为子进程间的互斥,所以每个子进程在执行开始都对管道pipe加锁,那么这样同时就只能有一个子进程向管道写入数据,并且子进程在向管道中写入数据后还要调用sleep()系统调用睡眠若干时间,那么这样就可以保证父进程能够从管道中读出数据。然后下一子进程才能写入。那么这样就保证了开头所说的子进程在写入之前要确定管道中的数据已经被父进程读出,否则不能写入或者阻塞自己。

注意事项

本文(操作系统实验三进程的管道通信)为本站会员(枫**)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

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




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.