您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 进程的管道通信实验说明书
1*******************实践教学*******************兰州理工大学计算机与通信学院2011年秋季学期操作系统原理课程设计题目:进程的管道通信实验专业班级:09计算机(5)班姓名:董跃永学号:09240521指导教师:年福忠成绩:_______________2目录摘要.............................................................3正文.............................................................4一.问题描述.................................................4二.设计目的.................................................4三.设计要求.................................................5四.详细设计.................................................51.程序流程图..............................................62.算法设计................................................7五.结果分析.................................................9设计总结...........................................................10参考文献...........................................................11致谢.............................................................12附件Ⅰ源程序代码..................................................133摘要管道通信是发送进程和接收进程之间通过一个通道交流信息,管道是单向的,发送进程视管道为输出文件,即向管道写入数据,接收进程视管道为输入文件,即从中读取数据。先写入的必定先读出,即管道通信的工作是单向的并以先进先出为顺序。管道通信的实质是一个共享文件,数据以自然字符流的方式写入和读出。在Linux系统中,进程在执行系统调用pipe()之后便创建了一个无名管道。在管道通信实验中,可用父进程创建一个无名管道,子进程向其中写入信息,父进程从其中读取信息并显示。关键词:父进程,子进程,管道,通信,文件4正文一.问题描述:(1).了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。(2).编写程序实现进程的管道通信。用系统调用pipe()建立一管道,二个子进程P1和P2分别向管道各写一句话:Child1issendingamessage!Child2issendingamessage!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。二.设计目的:通过该题目的设计过程,熟悉UNIX/LINUX支持的管道通信方式,了解该系统下进程管道通信机制,掌握进程管道通信程常用的系统函数,能够编写代码实现父子进程的管道通信。练习并掌握UNIX/LINUX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。5三.设计要求:编写程序实现进程的管道通信。用系统调用pipe()建立一管道,二个子进程P1和P2分别向管道各写一句话:Child1issendingamessage!Child2issendingamessage!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。四.详细设计:1.程序流程图函数的调用关系图:6开始子进程1创建成功?创建子进程2是是是否子进程2创建成功?锁定管道写入端fd[1]将信息“Childprocess1issendingmessage!”输入变量OutPipe否子进程1终止结束创建管道fd管道fd创建成功?否创建子进程1锁定管道写入端fd[1]将OutPipe里的信息写入管道写入端fd[1]解除对写入端fd[1]的锁定将信息“Childprocess2issendingmessage!”输入变量OutPipe将OutPipe里的信息写入管道写入端fd[1]解除对写入端fd[1]的锁定子进程1等待父进程从管道读取端fd[0]读出信息到变量InPipe子进程2等待父进程从管道读取端fd[0]读出信息到变量InPipe将InPipe里的信息打印到屏幕上子进程2终止父进程终止72.算法设计各模块的伪码算法该函数使用头文件如下:#includesys/types.h#includeunistd.h#includestdio.h#includestdlib.h1.pipe()函数调用格式:intfd[2];pipe(fd)功能:建匿名管道,fd[0]为读端,fd[1]为写端。2.fork()函数调用格式:pid_tpid1,pid2;pid1=fork();pid2=fork();功能:fork()函数创建子进程。注:此函数被调用一次但返回两次,子进程中返回0值,而父进程中返回子进程ID;调用fork()函数,父、子进程的执行次序不确定。3.sprintf()函数调用格式:charoutpipe[50];charstring=“hello”;sprintf(outpipe,string);功能:把字符串string的内容写入到字符数组outpipe中。4.write()函数调用格式:write(fd[1],outpipe,nbyte);功能:把nbyte个字节的数据,从outpipe所指向的缓冲区写到由fd所8指向的系统文件中。写入内容时,关闭读取端,锁定写入端,写入完成,解除锁定。5.read()函数调用格式:read(fd[0],inpipe,nbyte);功能:从fd[0]端读取nbyte个字节的数据,并把数据写入到inpipe中。6.lockf()函数调用格式:lockf(fd[1],1,0);功能:锁定管道写端,保证写入数据的完整性。lockf(fd[1],0,0);功能:解锁管道写端。7.wait()函数调用格式:wait(NULL);功能:在用fork()创建一个子进程的时候,若先进入父进程,则使其等待,直到子进程把信息写入管道,再执行父进程。8.sleep()函数调用格式:sleep(num);功能:使进程休眠num秒。9.exit()函数调用格式:exit(0);功能:子进程执行写入数据操作完成,退出,并向系统返回0值。9五.结果分析最终所得结果如下图所示:10设计总结通过这次课程设计,我对操作系统的进程管道通信有了进一步的了解,同时熟悉了在linux环境下c语言的编译和调试,以及linux系统有关进程管道通信的函数。更为重要的是,将所学的课本理论知识运用到实践当中,实现了理论与实践相结合,提高了解决实际问题的能力。从开始借阅书籍,上网查找相关资料,到设计程序,短短两周很快就过去了。在这次课程设计的过程中,我遇到了很多困难,通过自己的不断努力,同学的帮助,和老师的细心指导,进程的管道通信实验基本完成。其功能基本符合课程设计任务的要求。在此次实践设计中我遇到了很多困难,这说明对理论知识还需要深入地理解。动手实践编写程序,调试程序则是更为重要的。所以在平时学习课本知识的同时,需要亲自实践编写代码实现理论的知识,提高自己的实际动手能力,并加深对理论知识的理解。最后,通过该题目的设计过程,我熟悉Linux操作系统、gcc、vim编辑器、makefile、gdb以及linux下进程的管道通信,进一步理解了操作系统中进程管道通信的原理,并学会如何在linux操作系统中实现进程的管道通信。11参考文献1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.2.王清,李光明.《计算机操作系统》.冶金工业出版社.3.孙钟秀等.《操作系统教程》.高等教育出版社4.曾明.《Linux操作系统应用教程》.陕西科学技术出版社.5.张丽芬,刘利雄.《操作系统实验教程》.清华大学出版社.6.孟静.《操作系统教程--原理和实例分析》.高等教育出版社7.周长林.《计算机操作系统教程》.高等教育出版社8.张尧学.《计算机操作系统教程》.清华大学出版社9.任满杰.《操作系统原理实用教程》.电子工业出版社12致谢这次课程设计使我学到了很多实用知识,真正做到了理论与实践相结合,得到了操作系统方面的综合训练,提高了解决实际问题的能力。这次课程设计也使我明白了,学习知识不仅仅是停留在书本上那么简单,编写代码,调试程序,更是一种有效地学习知识的方法。只有理论与实践相结合才在以后的学习与工作中走的更高走的更远。在此,感谢年福忠老师孜孜不倦的指导同学无私的帮助。13附录Ⅰ:源程序代码#includesys/types.h#includeunistd.h#includestdio.h#includestdlib.hintmain(){pid_tpid1,pid2;intfd[2];charoutpipe[50],inpipe[50];if(pipe(fd)0)/*创建匿名管道,fd[0]为读端,fd[1]为写端*/{printf(Pipecreateerror!\n);exit(-1);}/*****Thisisthechildprocess1*//*****fork函数被调用一次但返回两次,子进程中返回0值,而父进程中返回子进程ID;*/14/*****但调用fork()父子进程的执行次序不确定.*//*如果创建子进程失败,则退出*/if((pid1=fork())==-1)/*创建子进程1*/{printf(Errorinfork().\n);exit(-1);}/*执行子进程1,向管道写入信息*/if(pid1==0){lockf(fd[1],1,0);/*锁定管道写端,保证写入数据的完整性*/sprintf(outpipe,child1issendingamessage!);write(fd[1],outpipe,35);/*子进程向管道中写入信息*/lockf(fd[1],0,0);/*解锁管道写端*/exit(0);/*子进程1退出*/}else{/*若先进入父进程,则使其等待,直到子进程1把信息写入管道*//*即:先让子进程1把信息写入管道,后让子进程2把信息写入管道*/15wait(NULL);/*Thisisthechildprocess2*//*如果创建子进程失败,则退出*/if((pid2=fork())==-1){printf(Errorinfork().\n);exit(-1);}/*执行子进程2*/if(pid2==0){lockf(fd[1],1,0);/*锁定管道写端,保证写入数据的完整性*/sprintf(outpipe,Child2issendingamessage!);write(fd[1],outpipe,34);lockf(fd[1],0,0);/*解锁管道写端*/exit(0);/*子进程2退出*/}else{wait(0);/*若先执行父进程,则等待,直到子进程2写入信息*/16sleep(1);/*休眠1秒*/read(fd[0],inpipe,35);/*从管道中读取信息,此信息由子进程1写入*/printf(%s\n,inpipe);/*打印输出信息*/sleep(1);read(fd[0],inpipe,35);/*从管道中读取信息,此信息由子进程2写入*/printf(%s\n,inp
本文标题:进程的管道通信实验说明书
链接地址:https://www.777doc.com/doc-320698 .html