《操作系统》课程设计报告书_进程间通信(IPC)消息机制.doc
河南城建学院操作系统课程设计报告书设计题目:进程间通信(IPC)消息机制专 业: 计算机科学与技术 指导教师: 班 级: 学 号: 姓 名: 同 组 人: 计算机科学与工程系2010年01月14日前言课程设计是检测学生学习课程效果的重要手段,是训练学生通过所学知识解决实际问题的重要方式,同时也是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。操作系统是一门重要的专业课,是计算机理论和应用的核心基础课程。操作系统课程设计,是一次对多学知识的综合演练,要求学生在操作系统的设计理念、整体机构、模块划分、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。在这次的课程设计中我们选择的题目是进程间通信(IPC)消息机制的设计,实现消息的创建、发送和接收及在sever端创建一个服务函数,从而形成C/S通讯模式。 消息机制是消息通过消息队列的方式进行进程间消息的传递。通过此次课程设计,全面理解消息机制进程间通信方法。实现把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机操作系统的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解的目的。目录一、系统环境.3二、设计目的.3三、总体设计.3消息的创建、接收和发送.4四、功能模块说明5数据结构.5系统调用函数、参数值及说明.5五、源程序清单及执行结果分析7消息的创建、接收和发送.75.2功能扩展.85.3执行结果分析.9六、总结与体会.11七、参考文献.11一、系统环境1.硬件环境: Pentium® 3.06GHz, 512MB的内存 物理地址扩展2.软件环境: Microsoft windows XPVMware workstation (Red Hat Linux 9)使用C+或者C语言二、设计目的通过课程设计,了解自己在学习中的不足,同时也增强了自己学习的兴趣。学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。这次设计可以帮助我们加深对操作系统的设计理念,编程结构和高级语言程序设计、数据结构的利用、系统的分析、算法的设计,程序调试以及错误处理等过程的理解,同时熟练了编程工具的使用,练习了自己的分析问题和解决问题的能力,练习了自己编程的能力,促进对操作系统课程的认识。认识到操作系统在整个计算机系统中的重要作用。三、总体设计(1)消息的创建、发送和接收使用系统调用msgget(),msgsnd(),msgget(),及msgctl()编制一长度为1K的消息发送和接收的程序。,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。bSERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER每接收到一个消息后显示一句“(server)received”。c.CLIENT端使用key为75的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示一句“(client)sent”SERVER和CLIENT均退出后结束。(2)功能扩展:在sever端创建一个服务函数,从而形成C/S通讯模式要求SERVER每接收到一次数据后不仅仅显示“(server)received”,而是做一些其它事情,比如读取或查询某个文件等。此功能可由设计者自己定义。在此基础上可以扩展客户端,比如设计一个菜单界面,接收不同的选项,并发送到服务器端,请求对方提供服务。流程图消息的创建、发送和接受四、模块功能说明1.数据结构struct msgform/消息结构long mtype;char mtext1030;/文本长度 msg;2.系统调用函数、参数值及说明(1)fork() 创建一个新进程。 用法:int fork() 其中返回int取值意义如下: 0:创建子进程,从子进程返回的id值 ;>0:从父进程返回的子进程id值;-1:创建失败(2) msgget(key,flag) 获得一个消息的描述符。头文件:#include<sys/types.h>#include<>#include<syy/msg.h>参数定义:int msgget(key,flag)key_tkeyintflag;语法格式:msgqid=msgget(key,flag);(3)msgsnd(id,msgp,size,flag) 送一消息 参数定义:int msgrcv(id,msgp,size,type,flag)int id,size,type,flag;structmsgbuf*msgq;structmsgbuf long mtype schar mtext;语法格式:count=msgrcv(id,msgp,size,type,flag);其中:id:消息描述符;msgp:用来存放欲接收消息的拥护数据结构的地址;size:msgp中数据数组的大小;type:用户要读的消息类型:type=0:接收该队列的第一个消息;type>0:接收类型type的第一个消息;type<0:接收小于或等于type绝对值的最低类型的第一个消息。flag:规定倘若该队列无消息,核心应当做什么事,如果此时设置了IPC_NOWAIT标志,则立即返回,若在flag中设置了MSG_NOERROR,且所接收的消息大小大于size,核心截断所接受的消息。count:返回消息正文的字节数。(4)msgrcv(id,msgp,size,type,flag) 接受一消息头文件:#include<sys/types.h>#include<>#include<sys/msg.h>参数说明:int msgrcv(id,msgp,size,type,flag)int id,size,type,flag;structmsgbuf*msgq;structmsgbuf long mtype schar mtext;语法格式:count=msgrcv(id,msgp,size,type,flag);其中:id:消息描述符;msgp:用来存放欲接收消息的拥护数据结构的地址;size:msgp中数据数组的大小;type:用户要读的消息类型:type=0:接收该队列的第一个消息;type>0:接收类型type的第一个消息;type<0:接收小于或等于type绝对值的最低类型的第一个消息。flag:规定倘若该队列无消息,核心应当做什么事,如果此时设置了IPC_NOWAIT标志,则立即返回,若在flag中设置了MSG_NOERROR,且所接收的消息大小大于size,核心截断所接受的消息。count:返回消息正文的字节数。(5)msgctl(id,cmd,buf) 查询一个消息描述符的状态,设置它的状态及删除一个消息描述符。头文件:#include<sys/tyes.h>#include<sys/ipc.h>#include<sys/msg.h>参数定义:int msgctl(id,cmd,buf)int id,cmd;structmsqiq_ds*buf;其中:函数调用成功时返回0,调用不成功时返回-1。id:用来识别该消息的描述符;cmd:规定命令的类型。IPC_STAT:将与id相关联的消息队列首标读入buf。IPC_SET:为这个消息序列设置有效的用户和小组标识及操作允许权和字节的数量。IPC_RMID:删除id的消息队列。buf:是含有控制参数或查询结果的用户数据结构的地址。五、源程序清单与执行结果分析1.消息的创建、发送和接受#include<stdio.h>#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#define MSGKEY175/定义关键词MSGKEYstruct msgform/消息结构long mtype;char mtext1030;/文本长度 msg;int msgqid,i;void CLIENT()int i,msgqid=msgget(MSGKEY,0777); /建立消息队列for(i=10;i>=1;i-) msg.mtype=i;printf("(client)sentn");msgsnd(msgqid,&msg,1024,0); /发送消息msg入msgid消息队列exit(0);void SERVER()msgqid=msgget(MSGKEY,0777|IPC_CREAT);/由关键字获得消息队列do msgrcv(msgqid,&msg,1030,0,0);/从msgqid队列接收消息msgprintf("(server)receivedn"); while(msg.mtype!=1);/消息类型为1时,释放队列msgctl(msgqid,IPC_RMID,0);exit(0);main()while(i=fork()=-1);if(!i)SERVER();while(i=fork()=-1);if(!i)CLIENT();wait(0);wait(0);exit(0);2.功能扩展#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<error.h>#include<sys/types.h>#include<sys/msg.h>#include<sys/ipc.h>#define MSGKEY 75 /定义关键词MSGKEY#define SHMKEY 75 /定义共享区关键词struct msgform long mtype; char mtext1030; msg;int msgqid,i;void msCLIENT() int i; char buffer1024; printf("please input you want to send message:"); fgets(buffer,1024,stdin); strcpy(msg.mtext,buffer); msgqid=msgget(MSGKEY,0777); for(i=10;i>=1;i-) msg.mtype=i; msgsnd(msgqid,&msg,1024,0); printf("(client)sentn"); exit(0);void msSERVER() msgqid=msgget(MSGKEY,0777|IPC_CREAT); /由关键字获得消息队列 do msgrcv(msgqid,&msg,1030,0,0); printf("server receive the message is :%s",msg.mtext); FILE *fp; fp=fopen("log.txt","a+"); fwrite(msg.mtext,1024,1,fp); fclose(fp); while (msg.mtype!=1); msgctl(msgqid,IPC_RMID,0); exit(0);int main() while(i=fork()=-1); if(!i)msSERVER(); while(i=fork()=-1); if(!i)msCLIENT(); wait(0); wait(0);exit(0);3.执行结果分析1).消息的创建、发送和接收的实验结果(client)sent(client)sent(client)sent(client)sent(client)sent(client)sent(client)sent(client)sent(client)sent(client)sent(server)received(server)received(server)received(server)received(server)received(server)received(server)received(server)received(server)received(server)received结果分析:主进程里分别创建两个子进程,第一个进程为服务(接收)进程,第二个进程为发送进程。程序运行时由服务进程创建一个消息队列,接收发送进程向队列中发送的消息(程序中发送进程一次向消息队列中发送类型从10到1的消息)。发送进程和服务进程分别发送和接收了10条消息,与预期设想一致。消息的传送和控制并不保证完全同步,当一个程序不在激活状态的时候,它完全可能继续睡眠,造成了上面的现象,在多次发送消息后才接收。2)功能扩展 ,运行结果及分析 please input you want to sent message: whoami (client)sent(server) receive the message is : whoami (client)sent(client)sent(client)sent(client)sent(client)sent(client)sent(server) receive the message is : whoami (server) receive the message is : whoami (server) receive the message is : whoami (server) receive the message is : whoami 结果分析::运行的结果和预想的完全一样。试验结果分析:主进程里分别创建两个子进程,第一个进程为服务(接收)进程,第二个进程为发送进程。程序运行时由服务进程创建一个消息队列,开始为空,当发送进程(用户控制)输入需要发送的消息时,接收进程接收发送进程向队列中发送的消息并输出。六、总结与体会课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,操作系统一直都是计算机设计中最重要的领域,它管理和控制着计算机的软硬件资源,合理组织和安排计算机的工作流程,为用户提供良好的工作环境接口 。因此作为二十一世纪的大学来说掌握操作系统的开发技术是十分重要的。经过一星期的上机实验学习我们学到了很多东西,使我对又多了进一步的了解和认识,在课程设计过程中我们遇到了很多的困难,但是我们去图书馆查阅和翻读了很多资料来加强操作系统方面的知识,同时在老师的帮助下使得设计能够进行下去,最后做出了令人满意的结果在此次的课程设计中我学到了很多在课堂上学不到的知识,在课堂上我们只是了解和记住了一些系统调用函数(例如msgget(),msgsnd(),msgget(),及msgctl():)的定义和使用方法,但是在实际操作中我们学到了这些函数的调用和它们在系统中所特有的方法,明白了怎样来对进程间的通信进行管理以及进程间是怎样进行通信的。怎样把用户的ID等读入和读出与msgsqid相关的消息队列中,主要运用的算法来实现对进程的读入和读出,这样的去实现这样的调换。回顾起此次操作系统课程设计,我感慨颇多。的确,从理论到实践,在整整一星期的日子里,可以说是苦多于甜,但是我们从中学到很多很多的东西,同时 不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,但在同组人员的共同努力和老师的帮助下,最终算是顺利完成了。在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我学得到很多实用的东西。通过这次操作系统课程设计,我更深的体会到团队精神的重要。不仅仅是在平时学习的过程中,我们需要合作,在以后的工作中更需要团队精神。一个人只有把他自己融入团体中,他才能真正的有所作为,有所成就。在此,真心感谢辅导我们的老师们,他们的一些话语减少了我们在课程设计过程少走了很多弯路,在很多问题上豁然开朗其他恭维的话也不说了,再次向他们表示衷心的感谢!在此次的设计中我锻炼了自己解决问题的能力,但也遇到了很多的困难,但经过问老师和同学终于把问题得到了解决。也从中学到了关于操作系统近一步的知识,把在课堂上学到的理论得到了很好的应用。也把知识得到了巩固更加深了印象。在以后的学习中会加强这方面的印象的,到仅有这些还是远远不够的,还要在一些知识点上继续的努力才能在以后的学习中得到很好的提高。七、参考文献1计算机操作系统教程(第三版) 张尧学 史美林 张高 编著 清华大学出版社2操作系统(第三版)汤小丹 梁红兵 哲凤屏 汤子瀛 编著 西安电子科技大学出版社3数据结构(C语言版) 严蔚敏 编著 清华大学出版社4C语言程序设计 谭浩强 编著 清华大学出版社