版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、河南城建学院操作系统课程设计说明书设计题目: 管道通信 专 业: 计算机科学与技术 指导教师: 邵国金 班 级: 0814091 学 号: 081409126 姓 名: 刘燕龙 同 组 人: 杨俊鹏 、魏中亚 计算机科学与工程系2011年12 月 30 日前 言本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是Red Hat Linux 9,言语开发环境是Linux的GNU C或C+。Linux操作系统是一个向用户开放源码的免费的类UNIX操作系统。它为在校学生学习操作系统课程提供了一个看得见摸得着的范例。对于学生正确理解,掌握操作系统的基本知识具有重要意义。鉴于此,本操作系统课程涉
2、及的实验均在Linux环境下进行。这就要求大家:(1)熟悉Linux的操作和开发环境;(2)具有C语言知识(Linux操作系统大约90%的源码是用C语言编写)。我们的设计和实验将在Windows xp环境下,基于虚拟机软件VMWare软件进行安装。学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机
3、会。管道通信,通过在两个进程间创建通道,一个写信息通过通道传送给另一个进程并且读出来,同过实践让我们了解了什么是管道通信机制,实现了程序进程间的通信。积极通过合作,完成任务。目 录一、系统环境.4二、设计目的.4三、设计题目及要求.4(1)设计管道通信4(2)设计命名管道.4四、总体设计.4五、详细设计.61、实现管道通信 .6 2、命名管道设计 .8六、调试与测试方法.12七、执行结果及分析.13八、源程序清单.14九、心得体会.19十、参考文献.19一、 系统开发环境Windows Xp系统、和虚拟机上运行的Red Hat Linux 9系统运行环境。二、设计目的1、进一步了解什么是进程,
4、以及创建进程的方式。2、实现UNIX/LINUX系统环境下的进程通信方式。3、熟练掌握C/S中的管道通信机制。4、开辟一个共享区,实现进程共享资源,互相通信三、设计题目及要求利用UNIX系统提供的进程通信机制实现通信以及共享内存区的实现(1) 共享存储区的创建,附接和断接使用系统调用shmget(),shmat(),msgdt(),shmctl(),编制一长度为1K的消息发送和接收的程序。1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。SERVER和CLIENT也可分别为2个各自独立的程序。2)SERVER端建立一个Key为
5、375的共享区,并将第一个字节置为-1,作为数据空的标志,等待其他进程发来的消息。当该字节的值发生变化时,表示收到了信息,并进行处理。然后再次把它的值设为-1。如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER。SERVER每接收到一次数据后显示“(server)received”。3)CLIENT端建立一个Key为375的共享区,当共享取得第一个字节为-1时,SERVER端空闲,可发送请求。CLIENT随即填入9到0。期间等待Server端的再次空闲。进行完这些操作后,CLIENT退出。CLIENT每发送一次数据后显示“(client)sent”。4)父进程在SERVER和CL
6、IENT均退出后结束。(2)功能扩展:在sever端创建一个服务函数,从而形成C/S通讯模式要求SERVER每接收到一次数据后不仅仅显示“(server)received”,而是做一些其它事情,比如读取或查询某个文件等。此功能可由设计者自己定义。四、总体设计 1.int fork()创建一个新进程。用法:int fork()其中返回int取值意义如下:0:创建子进程,从子进程返回的id值>0:从父进程返回的子进程id值-1:创建失败2.int shmget(key,size,shmflg|IPC_CREAT)头文件: #include<sys/shm.h> #include&
7、lt;sys/ipc.h>参数定义:key:为申请共享内存的标示符;size:为申请共享内存的大小;shmflg:用户设置的标识或访问方式,与消息缓冲shmget中的含义相同,这实验中可以使用0777|IPC_CREAT,表示任意进程可读可写。IPC_CREAT:当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共性内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符。利用此系统调用在内存中开辟一块共享区。用法: int shmget()返回值为开辟出来共享内存的标号。3.void *shmat(int shmid,const voi
8、d *shmaddr,int shmflg)头文件: #include<sys/shm.h> #include<sys/types.h>参数定义:shmid:表示申请共享内存空间的标示符。shmaddr:指定共享内存出现在进程内存地址什么位置,直接指定为NULL让内核自己决定一个合适的位置shmflg:SHM_RDONLY为只读模式,其他为读写模式。返回值为共享内存的首地址。4.int shmctl(int shmid,int cmd,strucr shmid_ds *buf)头文件: #include<sys/types.h> #include<sy
9、s/shm.h>参数定义:Shmid:共享内存标识符。开始i=0i=fork()Cellnumber文件信息 Y i=fork()Serverr服务器i=0 Y NClient()Client(1)Chioice=Client(2)Client(3)结束 总体流程图1 五、详细设计1.主函数int main()int choice,i; char ch520; display(); do printf("请选择一项功能项:n"); scanf("%d",&choice); fflush(stdin); while(choice!=1&
10、;&choice!=2&&choice!=3&&choice!=4) printf("输入有误,请重新输入:n"); scanf("%d",&choice); fflush(stdin); if(choice=4) return 0; else while(i=fork()=-1); if(!i)server(ch); else while (i=fork()=-1); if(!i)client(choice); wait(0);wait(0); while(choice!=4);return 0;2.菜单
11、显示void display()printf("-n");int i;for(i=1;i<=15;+i)if(i=3|i=6|i=9|i=12)if(i=3) printf("| 1.购买手机卡: |n");if(i=6) printf("| 2.手机充值: |n");if(i=9) printf("| 3.办理网银: |n");if(i=12) printf("| 4.退出本系统: |n");elseprintf("| |n");printf("-n&quo
12、t;);3.服务器端:void server() char ch120;int shmid1,shmid2,shmid3,shmid4;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0);*addr=-1;while(*addr=-1);if(*addr=1) char c; char number50='0' FILE *fp; if(fp=fopen("Info.txt","rw+")=NULL) printf("文件未能打开!n"); re
13、turn ; shmid1=shmget(CLIENTONE,1024,0777|IPC_CREAT);addr1=shmat(shmid1,0,0);printf("请输入您喜欢的手机号码:n"); addr1->makr=-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(number,addr1->ch) printf(&q
14、uot;号码已经占用,请重新选择一个:n"); return ; else numberi=c; c=fgetc(fp); +i; printf("手机号码已选定,请缴费100元: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(sh
15、mid2,0,0);printf("请输入您的手机号码:n");addr2->makr=-1;while(addr2->makr=-1);if(addr2->makr=1)printf("Input Your Payroll:n");addr2->makr=-1;while(addr2->makr=-1);if(addr2->makr=2)printf("充值完成!n");shmctl(shmid2,IPC_RMID,0);if(*addr=3) shmid3=shmget(CLIENTTHREE,
16、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->makr=2)printf("办理完成,祝您愉快!n");shmctl(shmid3,IPC_RMID,0);shmctl(
17、shmid,IPC_RMID,0);4.客户端程序:void client(int choice) int shmid1,shmid2,shmid3; int payroll;char ch120,ch250;shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0); while(*addr!=-1);if(choice=1) *addr=1;shmid1=shmget(CLIENTONE,1024,0777|IPC_CREAT);addr1=shmat(shmid1,0,0);while(addr1->makr!=-1
18、);scanf("%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);scanf("%s",ch1);addr2->makr=1;while(addr2->
19、;makr!=-1); scanf("%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);scanf("%s",ch1);addr3->makr=1;while(addr3->makr!=-1);scanf("%s",ch2);addr3->makr=2;六、调试与
20、测试任务一编译方法: 编译:cc liulong.c执行:./a.out任务二编译方法是:编译:cc o fifo_svr fifo_srv.ccc o fifo_clt fifo_client.c执行:先启动server端程序,方法为:./fifo_svr再换一个终端运行client端,方法是:./fifo_clt运行时,client只运行一次就将退出,而server端作为服务器仍将继续运行,你再次启动client来请求服务。七、执行结果及分析<任务一运行结果>正常:管道实现通信<任务二运行结果>出现错误如下:服务器运行起初正常,然后当与客户端建立通信时由于客户端程序
21、出错,导致整个通信出现错误。 由客户端引起的服务器程序运行出现错误当服务器输送文件时,打开服务器出现错误继续结果一样:客户端程序运行出现错误服务器等待通信连接: 服务器程序正常运行八、源程序清单<任务1>#include <unistd.h>#include <signal.h>#include <stdio.h>int pid1,pid2; main( ) int fd2;char outpipe100,inpipe100;pipe(fd); while (pid1=fork( )=-1);if(pid1=0) lockf(fd1,1,0);
22、sprintf(outpipe,"child 1 process is sending message!"); write(fd1,outpipe,50); sleep(5); lockf(fd1,0,0); exit(0); else while(pid2=fork( )=-1); if(pid2=0) lockf(fd1,1,0); sprintf(outpipe,"child 2 process is sending message!"); write(fd1,outpipe,50); sleep(5); lockf(fd1,0,0); exit(
23、0); else wait(0); read(fd0,inpipe,50); printf("%sn",inpipe); wait(0); read(fd0,inpipe,50); printf("%sn",inpipe); exit(0); <任务2>头文件:#define my_fifo "my_fifo"#define file_name "server."客户端程序:#include<stdio.h>#include<sys/types.h>#include<sys
24、/stat.h>#include"fifo_hd.h"main(int argc,char *argv)intfd1,fd2,pid,pid1;charmy_buf100;charmy_fil100;charmy1buf100;if(fd1=open(my_fifo,1)=-1)fprintf(stderr,"Open well_known FIFO for readind Error!n");exit(-1); fprintf(stderr,"Open %s OK!n",my_fifo);pid=getpid();sprint
25、f(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);strncat(my_fil,my_buf,5);fprintf(stderr,"Send_fil: %sn",my_fil);sleep(2);if(fd2=open(my_fil,2)=-1)fprintf(stderr,"open %s Error!n",my_fil);close(fd1);exit(-2);fprintf(stder
26、r,"open %s OK!n",my_fil);if(read(fd2,my1buf,5)!=0)my1buf5='0'fprintf(stderr,"Read from my_buf:%s!ntmy1buf:%s",my_buf,my1buf);if(strncmp(my_buf,my1buf,5)!=0)fprintf(stderr,"Different occurs!n");strcpy(my_buf,"0000000000");write(fd2,my_buf,5);/sleep(5);c
27、lose(fd2);close(fd1);服务器程序:#include<stdio.h>#include<signal.h>#include<sys/types.h>#include<sys/stat.h>#include"fifo_hd.h"voidterminate();intwell_known_id,tmp_id;chartmp_fil100;main(int argc,char *argv)intfd1,fd2;pid_tpid;charmy_buf100,my_fil100,my_tmp100;sprintf(my
28、_buf,"rm -f %s > /dev/null",my_fifo);system(my_buf);/do shell cmd rm -f my_fifo > /dev/nullwell_known_id=tmp_id=-1;signal(SIGINT,terminate);if(mkfifo(my_fifo,S_IRWXU|S_IRWXG|S_IRWXO)=-1)fprintf(stderr,"Create Well_known FIOF Error!n");exit(-1);fprintf(stderr,"mkfifo OK
29、!n");fprintf(stderr,"A New Seession! I'm waiting connection.n");loop1:if(fd1=open(my_fifo,0)=-1)fprintf(stderr,"Open well_known FIFO for readind Error!n");unlink(my_fifo);exit(-2); well_known_id=fd1;tmp_id=-1;fprintf(stderr,"open my_fifo OK!n");if(read(fd1,my_b
30、uf,20)!=0)fprintf(stderr,"My_buff=%sn",my_buf);strcpy(my_fil,file_name);strncat(my_fil,my_buf,5);strcpy(tmp_fil,my_fil);if(pid=fork()!=0)close(fd1);wait();goto loop1;fprintf(stderr,"Tmp_FIFO is: %s|n",my_fil);if(mkfifo(my_fil,S_IRWXU|S_IRWXG|S_IRWXO)=-1)fprintf(stderr,"Creat
31、e my_fil:%s FIFO Error!n",my_fil);exit(-1); /system("ls server*");if(fd2=open(my_fil,2)=-1)fprintf(stderr,"Open %s Error!:%dn",my_fil,fd2);close(fd1); unlink(my_fifo);exit(-3);tmp_id=fd2;if(write(fd2,my_buf,5)!=5)fprintf(stderr,"Write %s Error!n",my_fil);close(fd2); close(fd1);unlink(my_fil); unlink(my_fifo);exit(-4);sleep(1);if(read(fd2,my_tmp,5)!=5)fprintf(stderr,"read %s Error!n",my_fil);close(fd2); close(fd1);unlink(my_fil); un
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 粮食安全沟通协调制度
- 浓密池管理制度
- 制度审核会议要求
- 班组的生产安全管理制度
- 特种设安全管理制度
- 厨余废弃物管理制度
- 职工违反请假制度
- 遵守会议制度保证书
- 防火安全生产检查制度
- 财务制度如何发挥作用
- 2024年《广西壮族自治区建筑装饰装修工程消耗量定额》(上册)
- (正式版)QBT 8020-2024 冷冻饮品 冰棍
- 《小学生C++创意编程》第6单元课件-do-while循环
- 2022青岛版科学五年级下册全册优质教案教学设计
- Unit10Lesson2Communityspirit课件-高中英语北师大版(2019)选择性必修第四册
- 建设项目全过程跟踪审计底稿(综合类、工程类、财务类)
- 旅游产品策划与设计课件(完整版)
- 2020 新ACLS-PCSA课前自我测试-翻译版玉二医【复制】附有答案
- ISO22000标准培训课件
- 哈工大模式识别课件
- 人音版三年级下册音乐教案全集
评论
0/150
提交评论