河南城建学院操作系统进程通信课程设计报告书

上传人:孙哥 文档编号:137805100 上传时间:2022-08-19 格式:DOCX 页数:27 大小:91.03KB
收藏 版权申诉 举报 下载
河南城建学院操作系统进程通信课程设计报告书_第1页
第1页 / 共27页
河南城建学院操作系统进程通信课程设计报告书_第2页
第2页 / 共27页
河南城建学院操作系统进程通信课程设计报告书_第3页
第3页 / 共27页
资源描述:

《河南城建学院操作系统进程通信课程设计报告书》由会员分享,可在线阅读,更多相关《河南城建学院操作系统进程通信课程设计报告书(27页珍藏版)》请在装配图网上搜索。

1、河南城建学院操作系统课程设计说明书设计题目:管道通信专业:计算机科学与技术指导教师:邵国金班级:0814091学号:081409126姓 名:刘燕龙同组人:杨俊鹏、魏中亚计算机科学与工程系2011年12月30日本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是Red Hat Lin ux 9 ,言语开发环境是 Linux的GNU C或C+。Linux操作系统是一个向用户开放源码的免费的类 UNIX操作系统。它为在校学生学习操作系统课程提供了一个看得见摸得着的范例。对于学 生正确理解,掌握操作系统的基本知识具有重要意义。鉴于此,本操作系统课程涉及的实验均在Linux环境下进行。这就要求

2、大家:(1) 熟悉Linux的操作和开发环境;(2) 具有C语言知识(Linux操作系统大约90%的源码是用C语言编写)。我们的设计和实验将在 Windows xp环境下,基于虚拟机软件VMWare软件进行安装。学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。管道通信,通过在两个进程间创建通

3、道,一个写信息通过通道传送给另一个进程并且读出来,同过实践让我们了解了什么是管道通信机制,实现了程序进程间的通信。积极通过合作,完成任务。目 录一、系统环境 4二、设计目的 4三、设计题目及要求4(1) 设计管道通信4(2) 设计命名管道 . .4四、总体设计 4五、详细设计 61、 实现管道通信 .62、 命名管道设计 .8六、调 试 与测 试 方.12七、执析行结果及.13八、单源程序14九、会心得19十、献参考19系统开发环境Windows Xp系统、和虚拟机上运行的Red Hat Lin ux 9 系统运行环境。、设计目的1、进一步了解什么是进程,以及创建进程的方式。2、实现UNIX/

4、LINUX系统环境下的进程通信方式。3、熟练掌握C/S中的管道通信机制。4、开辟一个共享区,实现进程共享资源,互相通信三、设计题目及要求利用UNIX系统提供的进程通信机制实现通信以及共享内存区的实现(1)共享存储区的创建,附接和断接使用系统调用shmget() , shmat() , msgdt() , shmctl(),编制一长度为1K的消息发送 和接收的程序。1) 为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER 和CLIENT,进行通信。SERVED CLIENT也可分别为2个各自独立的程序。2) SERVE喘建立一个Key为375的共享区,并将第

5、一个字节置为-1,作为数据空的标 志,等待其他进程发来的消息。当该字节的值发生变化时,表示收到了信息,并进行处理。然后再次把它的值设为-1。如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER SERVE海接收到一次数据后显示“(server)received ”。3) CLIENT端建立一个 Key为375的共享区,当共享取得第一个字节为-1时,SERVER端空闲,可发送请求。CLIENT随即填入9到0。期间等待Server端的再次空闲。进行完这些操作后,CLIENT退出。CLIENT每发送一次数据后显示“ (clie nt)se nt”。4) 父进程在SERVED CLIENT

6、均退出后结束。(2)功能扩展:在sever端创建一个服务函数,从而形成C/S通讯模式要求SERVER!接收到一次数据后不仅仅显示“ (server)received ”,而是做一些其它事情,比如读取或查询某个文件等。此功能可由设计者自己定义。四、总体设计1.i nt fork() 创建一个新进程。 用法: int fork()其中返回int取值意义如下:0:创建子进程,从子进程返回的id值0:从父进程返回的子进程id值-1 :创建失败2.i nt shmget(key,size,shmflg|IPC_CREAT)头文件:#in clude#in clude参数定义:key:为申请共享内存的标示

7、符; size :为申请共享内存的大小; shmflg:用户设置的标识或访问方式,与消息缓冲shmget中的含义相同,这实验中可以使用 0777|IPC_CREAT,表示任意进程可读可写。IPC_CREAT当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共性内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符。利用此系统调用在内存中开辟一块共享区。用法: int shmget()返回值为开辟出来共享内存的标号。3.void *shmat(i nt shmid,c onst void *shmaddr,i nt shmflg) 头文件:#in cl

8、ude#in clude参数定义:shmid:表示申请共享内存空间的标示符。直接指定为NULL让内核自己决定shmaddr:指定共享内存出现在进程内存地址什么位置, 个合适的位置shmflg:SHM_RDONLY为只读模式,其他为读写模式。返回值为共享内存的首地址。4.i nt shmctl(i nt shmid,i nt cmd,strucr shmid_ds *buf) 头文件:#in clude#in clude参数定义:Shmid:共享内存标识符。i=fork()Cellnumber文件信息i=0ChioiceNClie nt()总体流程图1五、详细设计1.主函数int mai n()

9、int choice;char ch 520;display。;doprin tf(请选择一项功能项:n);sca nf(%d,&choice);fflush(stdi n);while(choice!=1 &choice!=2&choice!=3&choice!=4)printf(输入有误,请重新输入:n);sca nf(%d,&choice);fflush(stdi n);if(choice=4)return 0;elsewhile(i=fork()=_1);if(!i)server(ch);elsewhile (i=fork()=-1);if(!i)clie nt(choice);wai

10、t(0);wait(0);while(choice!=4);return 0;2.菜单显示void display()printf(n);int i;for(i=1;imakr=-1;while(addr1-makr=-1);if(addr1-makr=1)c=fgetc(fp);int i=0;while (!feof(fp)if(c=n)numberi=0;i=-1;if(!strcmp( nu mber,addr1-ch):n);printf(”号码已经占用,请重新选择一个return ;elsenu mberi=c;c=fgetc(fp);+i;printf(手机号码已选定,请缴费 1

11、00元:n);addr1-makr=-1;while(addr1-makr=-1);if(addr1-makr=2)printf(交易完成,祝您愉快!n);shmctl(shmid1,IPC_RMID,0);if(*addr=2)shmid2=shmget(CLIENTTWO,1024,0777|IPC_CREAT);addr2=shmat(shmid2,0,0);printf(”请输入您的手机号码:n);addr2-makr=-1;while(addr2-makr=-1);if(addr2-makr=1)printf(Input Your Payroll:n);addr2-makr=-1;w

12、hile(addr2-makr=-1);if(addr2-makr=2)printf(充值完成! n);shmctl(shmid2,IPC_RMID,0);if(*addr=3) shmid3=shmget(CLIENTTHREE,1024,0777|IPC_CREAT);addr3=shmat(shmid3,0,0);printf(请输入您的身份证号:n);addr3-makr=-1;while(addr3-makr=-1);if(addr3-makr=1)printf(”请输入您的手机号码:n);addr3-makr=-1;while(addr3-makr=-1);if(addr3-mak

13、r=2)printf(”办理完成,祝您愉快!n);shmctl(shmid3,IPC_RMID,0);shmctl(shmid,IPC_RMID,0);clie nt(i nt choice)int shmid1,shmid2,shmid3;int payroll;char ch120,ch250;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,O,O);while(*addr!=-1);if(choice=1)*addr=1;shmid仁shmget(CLIENTONE,1024,0777|IPC_CREAT); addr1

14、=shmat(shmid1,0,0);while(addr1-makr!=-1);scan f(%s,addr1-ch);addr1-makr=1;while(addr1-makr!=-1);printf(已缴费 100 元!n”);addr1-makr=2;if(choice=2)*addr=2;shmid2=shmget(CLIENTTWO,1024,0777|IPC_CREAT); addr2=shmat(shmid2,0,0);while(addr2-makr!=-1);scan f(%s,ch1);addr2-makr=1;while(addr2-makr!=-1);sca nf(%

15、d,&payroll);addr2-makr=2;if(choice=3)*addr=3;shmid3=shmget(CLIENTTHREE,1024,0777|IPC_CREAT); addr3=shmat(shmid3,0,0);while(addr3-makr!=-1); scan f(%s,ch1); addr3-makr=1;while(addr3-makr!=-1); scan f(%s,ch2); addr3-makr=2;六、调试与测试任务一编译方法:编译:cc liulo ng.c执行:./a.out任务二编译方法是:编译:cc - o fifo_svr fifo_srv.c

16、cc - o fifo_clt fifo_client.c执行:先启动server端程序,方法为:./fifo_svr再换一个终端运行clie nt端,方法是:./fifo_clt运行时,client只运行一次就将退出,而server端作为服务器仍将继续运行,你再次启动client 来请求服务。七、执行结果及分析任务一运行结果 正常:管道实现通信任务二运行结果 出现错误如下:服务器运行起初正常, 然后当与客户端建立通信时由于客户端程序出错,导致整个通信出现错误。rcxitkxjiUMJsL文件 擒辑査右般?坯端口?rooLloca Itio s I roo LI cc 一o f i fo_sv

17、r f i fo _svr xC rontlnca llho I roo t # /f i fo svrikfiffl CKJ Ndw See & s ion! r in i t ing comicc I ion . jpcii Jiy_f i fo CK!_bu ff=023&402140004720rirp F F( i s - server 0234”3站c i ltd tc f in i Rh La Ik in耳 si ih se rvp r.02364! jpn iry_f i fo CK!Ijrp_F I Pt ie: se ever .U236412564?:e i led to

18、 finish m Ik inf wi th se rve r,0234!由客户端引起的服务器程序运行出现错误当服务器输送文件时,打开服务器出现错误继续结果一样:72 ru:?l 空件( 券辑(型 S(V) 终箱CD 转到(鱼 帝助3 r uotMoca Itioiit i oo rff rc -u f i fo_c IL f ifu_t 11 .c rootloca Ihot root* ,/fifo_elt()e rry_f i io tK!Se nd _f i I 5 serre r . 02liB4open server.023G斗 Error Irootlao llnst root*

19、客户端程序运行出现错误服务器等待通信连接:1WH创ocaltkjii 匕丈申日 编辑 査和里 终端 转到(也 档肋凹 rootlocaIhosI root# cc -o f i fo_s vr f i fo_svr.qrdut Allies lho& root# ./f ifo_svrirk i ii to CK!A Seess ion ! Im va it ing conjiecl ion.服务器程序正常运行八、源程序清单#in elude #in elude #i nclude int pid1,pid2;mai n()int fd2;char outpipe100,i npipe100;

20、pipe(fd);while (pid1=fork( )=_1);if(pid1=0)lockf(fd1,1,0);spri ntf(outpipe,child 1 process is sending message!);write(fd1,outpipe,50);sleep(5);lockf(fd1,0,0);exit(0);elsewhile(pid2=fork( )=-1);if(pid2=0)lockf(fd1,1,0);spri ntf(outpipe,child 2 process is sending message!);write(fd1,outpipe,50);sleep(

21、5);lockf(fd1,0,0);exit(O);elsewait(O);read(fdO,i npipe,50);prin tf(%sn,i npipe);wait(0);read(fd0,i npipe,50);prin tf(%sn,i npipe); exit(0);头文件:#defi ne my_fifo my_fifo#defi ne file _n ame server.客户端程序:#in clude#in clude#in clude#in cludefifo_hd.hmain (i nt argc,char *argv)int fd1,fd2,pid,pid1;charmy

22、_buf1OO;charmy_fil100;charmy1buf1OO;if(fd 仁ope n(my_fifo,1)=-1)fprin tf(stderr,Ope n well_k nown FIFO for readi nd Error!n);exit(-1);fprintf(stderr,Open %s 0K!n,my_fifo);pid=getpid();spri ntf(my_buf,%5.5d%6.6d%7.7d,pid,pid*10,pid*20);if(write(fd1,my_buf,20)!=0)strcpy(my_fil,file_ name);strn cat(my_f

23、il,my_buf,5);fprin tf(stderr,Se nd_fil: %sn,my_fil);sleep(2);if(fd2=ope n(my_fil,2)=-1)fprin tf(stderr,ope n %s Error!n,my_fil);close(fd1);exit(-2);fprintf(stderr,open %s OK!n,my_fil);if(read(fd2,my1buf,5)!=0)my1buf5=0;fprin tf(stderr,Read from my_buf:%s!ntmy1buf:%s,my_buf,my1buf);if(str ncmp(my_buf

24、,my1buf,5)!=0)fprin tf(stderr,Differe nt occurs!n);strcpy(my_buf,0000000000);write(fd2,my_buf,5);/sleep (5);close(fd2);close(fd1);服务器程序:#in clude#in clude#in clude#in clude#in cludefifo_hd.hvoidtermi nate();int well_k nown _id,tmp_id;chartmp_fil1OO;main (i nt argc,char *argv)int fd1,fd2;pid_tpid;cha

25、rmy_buf100,my_fil100,my_tmp100;spri ntf(my_buf,rm -f %s /dev/n ull,my_fifo);system(my_buf); /do shell cmd rm -f my_fifo /dev/ null well_k nownd=tmpd=-1;sig nal(SIGINT,termi nate); if(mkfifo(my_fifo,S_IRWXU|S_IRWXG|S_IRWXO)=-1) fprintf(stderr,Create Well_known FIOF Error!n); exit(-1);fprin tf(stderr,

26、mkfifo OK!n);fprin tf(stderr,A New Seessi on! Im wait ing connection .n); Ioop1:if(fd 仁ope n(my_fifo,0)=-1)fprin tf(stderr,Ope n well_k nown FIFO for readi nd Error!n); un li nk(my_fifo);exit(-2);well_k nownd=fd1;tmp_id=-1;fprin tf(stderr,open my_fifo OK!n); if(read(fd1,my_buf,20)!=0)fprin tf(stderr

27、,My_buff=%sn,my_buf); strcpy(my_fil,file_ name);strn cat(my_fil,my_buf,5);strcpy(tmp_fil,my_fil);if(pid=fork()!=0)close(fd1);wait();goto loop1;fprin tf(stderr,Tmp_FIFO is: %s|n,my_fil); if(mkfifo(my_fil,S_IRWXU|S_IRWXG|S_IRWXO)=-1)fprin tf(stderr,Create my_fil:%s FIFO Error!n,my_fil); exit(-1);/syst

28、em(ls server*);if(fd2=ope n(my_fil,2)=-1)fprintf(stderr,Open %s Error!:%dn,my_fil,fd2); close(fd1);un li nk(my_fifo);exit(-3);tmp_id=fd2; if(write(fd2,my_buf,5)!=5) fprin tf(stderr,Write %s Error! n,my_fil); close(fd2); close(fdl); un li nk(my_fil);unlin k(my_fifo);exit(-4);sleep(1);if(read(fd2,my_t

29、mp,5)!=5)fprin tf(stderr,read %s Error!n,my_fil);close(fd2); close(fdl);un li nk(my_fil);unlin k(my_fifo);exit(-5);else if(strncmp(my_tmp,00000,5)!=0)close(fd2); close(fdl);fprintf(stderr,Filed to finish talking with %s!n,my_fil); unlin k(my_fil);exit(-1);goto loopl;elseclose(fd2); close(fdl);fprint

30、f(stderr,OK to talking with %s!n,my_fil);unlin k(my_fil);un li nk(my_fifo);exit(0);void termi nate()if(well_k nownd!=-1)close(well_k nown_i d); un li nk(my_fifo);if(tmp_id!=-1)close(tmp_id);u nli nk(tmp_fil);fprin tf(stderr,The Server Program stoped by Sig nal:SIGINT!n); exit(0);九、心得体会此次课程设计一管道通信, 让

31、我实实在在地锻炼了自己的动手能力,基本操作以熟练掌握。设计中地任务一比较简单, 只是设计一个程序实现管道通信,通过查资料可以顺利完成;但是任务二一命名管道设计, 涉及到了头文件、 服务器程序和客户端程序,三者要在同一台计算机中,两个不同的终端上实现通信。服务器程序设计操作中没有出现什么问题,但是在连接客户端程序时, 客户端程序出错,编译出现错误,导致通信出现错误。通过向老师请教和同学询问,基本有些了解,但还是出现一些解决不了的问题,还需要多加联系然后多查资料,认真克服困难。通过这次课程设计, 我感觉到了,编程还是很有趣的一件事情,这次设计充分锻炼了我的动手能力,思维能力,设计能力,更重要的是合作精神,大家基础都有点差,但可以主动 找不足,主动查询资料,询问同学和请教老师,充分体现了新时代新青年的团结和探索精神。20072006十、参考文献1汤小丹,梁红兵编著计算机操作系统(第三版)西安电子科技大学出版社,2、 严蔚敏,吴伟民编著数据结构(C语言版)清华大学出版社,20073、张尧学,史美林,张高编著计算机操作系统教程(第3版)清华大学出版社,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!