浙江大学城市学院实验报告课程名称操作系统原理实验实验项目名称实验八进程通信——管道学生姓名专业班级学号实验成绩指导老师(签名)日期注意:务请保存好各自的源代码,已备后用。完成本实验后,将实验报告上传ftp。如没有个人文件夹,请按学号_姓名格式建立。文件名为:学号_姓名_实验XX,如30801001_XXXX_实验01一.实验目的和要求1.了解Linux系统的进程间通信机构(IPC);2.理解Linux关于管道的概念;3.掌握Linux支持管道的系统调用和管道的使用;4.巩固进程同步概念。二、实验内容用系统调用pipe()创建管道,实现父子进程间的通信。三、实验步骤1、并发进程的无管道通信1)编译运行给出的pipe1.c,观察运行结果。2)思考:观察程序运行结果,比较新旧文件的内容是否有差异,并分析原因。有差异,把1中的数字逐个读入到2中但是顺序会改变。2、多进程的管道通信,编译并运行给出的代码pipe3.c,观察并理解多进程通过管道通信。3、编写程序:(来自第三章习题)假定系统有三个并发进程read,move和print共享缓冲器B1和B2。进程read负责从输入设备上读信息,每读出一个记录后把它存放到缓冲器B1中。进程move从缓冲器B1中取出一个记录,加工后存入缓冲器B2。进程print将B2中的记录取出打印输出。缓冲器B1和B2每次只能存放一个记录。要求三个进程协调完成任务,使打印出来的与读入的记录的个数,次序完全一样。试创建三个进程,用pipe()打开两个管道,如错误!未找到引用源。所示,实现三个进程之间的同步。程序源码:#includeunistd.h#includesignal.h#includestdio.hintpid1,pid2;main(){intfd1[2];intfd2[2];charoutpipe[100],inpipe[100];pipe(fd1);pipe(fd2);/*创建两个管道*/while((pid1=fork())==-1);if(pid1==0){while((pid2=fork())==-1);if(pid2==0){lockf(fd1[1],1,0);/*把输出串放入数组outpipe中*/sprintf(outpipe,copythat!);write(fd1[1],outpipe,50);/*向管道写长为50字节的串*/sleep(3);/*自我阻塞3秒*/lockf(fd1[1],0,0);return0;}else{wait(0);/*同步*/read(fd1[0],inpipe,50);/*从管道中读长为50字节的串*/printf(son:%s\n,inpipe);lockf(fd2[1],1,0);/*互斥*/write(fd2[1],inpipe,50);sleep(1);lockf(fd2[1],0,0);return0;}}else{wait(0);/*同步*/read(fd2[0],outpipe,50);/*从管道中读长为50字节的串*/printf(father:%s\n,outpipe);return0;}}程序运行结果:程序分析:先fork一个子进程然后在子进程里面在fork出一个孙子进程,孙子进程向管道fd1写入copythat。然后通过管道子进程得到消息,然后再写入管道fd2,由管道fd2传送消息给父进程。四、讨论、心得记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。