




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验四:进程的管道通信实验题目进程的管道通信实验目的加深对进程概念的理解,明确进程和程序的区别。学习进程创建的过程,进一步认识进程并发执行的实质。分析进程争用资源的现象,学习解决进程互斥的方法。学习解决进程同步的方法。掌握Linux系统中进程间通过管道通信的具体实现实验内容使用系统调用pipe()建立一条管道,系统调用fork()分别创建两个子进程,它们分别向管道写一句话,如:Childprocesslissendingamessage!Childprocess2issendingamessage!父进程分别从管道读出来自两个子进程的信息,显示在屏幕上。当然,仅仅通过屏幕上输出这两句话还不能说
2、明实现了进程的管道通信,为了能够更好的证明和显示出进程的同步互斥和通信,在其中要加入必要的跟踪条件,如一定的输出语句等,来反映程序的并发执行情况实验要求这是一个设计型实验,要求自行、独立编制程序。两个子进程要并发执行。实现管道的互斥使用。当一个子进程正在对管道进行写操作时,另一个欲写入管道的子进程必须等待。使用系统调用lockf(fd1,1,0)实现对管道的加锁操作,用lockf(fd1,0,0)解除对管道的锁定。实现父子进程的同步,当父进程试图从一空管道中读取数据时,便进入等待状态,直到子进程将数据写入管道返回后,才将其唤醒。为了清楚的反应进程的同步,在子进程完成相应的操作后,调用sleep
3、()函数睡眠一段时间(程序中定为3s)。父进程先执行wa计()函数,当有子进程执行完毕后,会得到子进程的返回结果并清理子进程。若子进程没执行完,父进程一直执行wait()进行监听,知道有一个子进程执行完成为僵尸进程。程序中用到的系统调用因为程序时在linux系统上进行编写的,所以其中要利用到相关的linux提供的系统调用。所用到的系统调用包含在如下头文件中。#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>#include<stdlib.h>#include<stdio.h
4、>#include<errno.h>fork()用于创一个子进程格式:intfork();返回值:在子进程中返回0;在父进程中返回所创建的子进程的ID值;当返回-1时,创建失败。wait()常用来控制父进程与子进程的同步。在父进程中调用wait(),则父进程被阻塞,进入等待队列,等待子进程结束。当子进程结束时,父进程从wait()返回继续执行原来的程序。返回值:大于0时,为子进程的ID值;等于-1时,调用失败。exit()是进程结束时最常调用的。格式:voidexit(intstatus);其中,status为进程结束状态。pipe()用于创建一个管道格式:pipe(intf
5、d);其中fd是一个由两个数组元素fd0和fd1组成的整型数组,fd0是管道的读端口,用于从管道读出数据,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)
6、从管道的读入口读出信息放入字符串String中。程序流程图程序流程简述父进程:创建管道;创建子进程1;创建子进程2;等待从管道中先后读出两个子进程写入的信息,并显示在屏幕上;退出。子进程:将管道的写入口加锁;将信息“Childprocessnissendingmessages!输入到变量OutPipe中,n=1,2;将OutPipe中信息写入管道;使自己进入睡眠状态,另一进程执行;从睡眠状态返回,将管道的写入口解锁;退出流程图睡眠等待父进程输出出错信心撤销子进程P1撤销子进程P2放弃处理机程序源代码<sys/types.h><sys/wait.h><unistd.
7、h><stdlib.h><stdio.h><errno.h>/*OS_3.c*/#include#include#include#include#include#includeintmain()(pid_tpc1,pc2,pr1,pr2;intfd2;charbuf150,buf250,s50;pipe(fd);/*创建管道*/pc1=fork();/*创建进程*/if(pc1<0)/*子进程1如果出错*/(printf("createchildprcocess1error:%sn",strerror(errno);exit(
8、1);elseif(pc1=0)/*如果是子进程1占据CPU*/(lockf(fd1,1,0);/*对管道加锁*/sprintf(buf1,"childprocess1%dissendingmessagen",getpid();write(fd1,buf1,50);/*子进程1将信息写入管道*/printf("Nowinprocess1%d,I'msendingamessage.n",getpid();/*输入跟踪标记*/sleep(3);/*子进程1睡眠3秒钟*/lockf(fd1,0,0);/*解除锁定*/exit(0);pc2=fork()
9、;/*创建进程*/if(pc2<0)/*子进程2如果出错*/(printf("createchildprcocess2error:%sn",strerror(errno);exit(1);elseif(pc2=0)/*如果是子进程2占据CPU*/lockf(fd1,1,0);/*对管道加锁*/sprintf(bu12,"childprocess2%dissendingmessagen",getpid();/*输入要向管道中写入的信息*/write(fd1,buf2,50);/*子进程2将信息写入管道*/printf("Nowinproce
10、ss2%d,I'msendingamessage.n",getpid();sleep(3);/*子进程2睡眠3秒钟*/lockf(fd1,0,0);/*解除对管道锁定*/exit(0);/*如果是父进程*/printf("Nowinparentprocess,pid=%dn",getpid();pr1=wait(0);/*在这里等待子进程结束*/if(pr1>0)/*子进程正常返回*/read(fd0,s,50);printf("fatherprocess%dhasreceicedamessage:%sn",getpid(),s)
11、;else/*出错*/printf("error:%sn.n",strerror(errno);pr2=wait(0);/*在这里等待子进程结束*/if(pr2>0)/*子进程正常返回*/read(fd0,s,50);printf("fatherprocess%dhasreceicedamessage:%sn",getpid(),s);else/*出错*/printf("error:%sn.n",strerror(errno);exit(0);程序运行结果Linux系统下编译连接完运行结果如下图rooWlocalhostliuj
12、inpeng?./os_3Nowtnproccssl2947Jmsendingamessage,H,Nowinparentprocess*ptd=2946fatherprocess2946hasreceicedamessage:chiIdprocess129-17issendingme55HgeNowinprocess22948Jmsenthngamessage.,.fatherprocess2946hasreceicedamessage:chiIdprocess?2948issendingne55Hge对以上运行结果的解释首先程序输出在子进程1中的追踪语句,表明父进程创建完子进程后处理机由子
13、进程调度2947为进程id值,由getpid()系统调用得到;然后处理机执行父进程,并且三秒钟后输出子进程写入管道的信息;然后是子进程2的追踪信息,表明父进程创建子进程2后处理机交由子进程调度;最后当终端停止三秒钟后输出父进程已经从管道中读取的子进程2写入的信息回答以下问题:指出父进程与两个子进程并发执行的顺序,并说明原因。答:父进程创建子进程1,然后子进程1执行,子进程1执行完毕之后父进程执行并创建子进程2,子进程2执行,其执行完毕之后父进程执行,程序结束。即子进程先执行,然后父进程才执行。这是由进程的同步机制决定的,因为只有子进程向管道中写入信息后,父进程才能读取;否则父进程自己调用wai
14、t()系统调用将自己阻塞,将处理机交由子进程。若不对管道加以互斥控制,会有什么后果?答:管道进行互斥控制,是为防止两个子进程对管道资源进行争夺而产生信息丢失或覆盖。如果不加控制,那么可能一个子进程写入的信息还没来得及被父进程读出,另一个子进程又先写入信息,那么之前的进程写入的信息将被覆盖,父进程也就读不到之前进程传递来的信息了。说明你是如何实现父子进程之间的同步的。答:父子进程的同步主要体现在两个方面1、父进程读出之前确定管道中有数据,否则阻塞自己。这一点很容一般到,通过系统调用wait()函数,即可以实现,当子进程结束时父进程才执行,那么此时管道中肯定已经有子进程写入的数据了。2、子进程在写入之前要确定管道中的数据已
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关于工厂合同样本
- 养生馆整体转让合同样本
- 内转渣土运输合同标准文本
- 2025年计算机考试对教育公平的促进与实践方式研究试题及答案
- 2025年健康管理师考试考生职业发展分析及试题答案
- 农场养殖服务合同样本
- 村庄规划编制技术要点
- 合成生物学与基因回路课件
- 道德与法治教学方法创新心得体会
- 2025年北海康养职业学院单招职业适应性测试题库必考题
- Revit-基础教程课件
- 尿失禁的康复计划
- 南昌航空大学往年计算机C语言题目(含六套)
- 农村宅基地和建房(规划许可)申请表
- 区域新能源集控中心建设方案
- 英语四线三格Word版
- 行政公文写作-决定(应用文写作课件)
- 自身免疫性肝病的诊治进展
- DB35∕323-2018 厦门市大气污染物排放标准
- 管道沟槽开挖专项施工方案
- 小学英语-He is playing the suona,but the phone rings.教学课件设计
评论
0/150
提交评论