ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:108.46KB ,
资源ID:28901411      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28901411.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统进程通信共享内存课程设计.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统进程通信共享内存课程设计.docx

1、操作系统进程通信共享内存课程设计河南城建学院操作系统课程设计说明书设计题目: 进程通信 专 业: 计算机科学与技术 指导教师: 邵国金、郭猛、薛冰 班 级: 学 号: 姓 名: 同 组 人: 计算机科学与工程系2013年1 月 10 日前 言本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是Red Hat Linux 9,言语开发环境是Linux的GNU C或C+。Linux操作系统是一个向用户开放源码的免费的类UNIX操作系统。它为在校学生学习操作系统课程提供了一个看得见摸得着的范例。对于学生正确理解,掌握操作系统的基本知识具有重要意义。鉴于此,本操作系统课程涉及的实验均在Linu

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

3、程通信,通过在两个进程间创建一块共享内存,将共享内存块分为两部分,标示位和数据域。通过实践让我们了解了什么是共享内存通信机制,实现了程序进程间的通信。积极通过合作,完成任务。一、系统开发环境 - 4 -二、设计目的 - 5 -三、设计题目及要求 - 6 -四、总体设计 - 7 -1、服务器功能 - 7 -2、客户端功能 - 7 -3、文件读取功能 - 8 -4、界面显示函数 - 8 -5、组成框图: - 9 -6.共享内存分配 - 9 -7.总体流程图 - 10 -五、详细设计 - 11 -1.主函数 - 11 -2.菜单显示 - 11 -3.服务器端: - 12 -4.客户端程序: - 14

4、 -5、部分函数介绍 - 15 -六、调试与测试 - 17 -七、执行结果及分析 - 18 -八、源程序清单 - 20 -九、心得体会 - 25 -十、参考文献 - 26 -一、系统开发环境Windows Xp系统、虚拟机上运行的Red Hat Linux 9系统运行环境。二、设计目的1、进一步了解什么是进程,以及创建进程的方式。2、实现UNIX/LINUX系统环境下的进程通信方式。3、熟练掌握C/S中的共享内存通信机制。4、开辟一个共享区,实现进程共享资源,互相通信。三、设计题目及要求利用UNIX系统提供的进程通信机制实现通信以及共享内存区的实现(1) 共享存储区的创建,附接和断接使用系统调

5、用shmget(),shmat(),msgdt(),shmctl(),编制一长度为1K的消息发送和接收的程序。1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。SERVER和CLIENT也可分别为2个各自独立的程序。2)SERVER端建立一个Key为375的共享区,并将第一个字节置为-1,作为数据空的标志,等待其他进程发来的消息。当该字节的值发生变化时,表示收到了信息,并进行处理。然后再次把它的值设为-1。如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER。SERVER每接收到一次数据后显示“(server)re

6、ceived”。3)CLIENT端建立一个Key为375的共享区,当共享取得第一个字节为-1时,SERVER端空闲,可发送请求。CLIENT随即填入9到0。期间等待Server端的再次空闲。进行完这些操作后,CLIENT退出。CLIENT每发送一次数据后显示“(client)sent”。4)父进程在SERVER和CLIENT均退出后结束。(2)功能扩展:在sever端创建一个服务函数,从而形成C/S通讯模式要求SERVER每接收到一次数据后不仅仅显示“(server)received”,而是做一些其它事情,比如读取或查询某个文件等。此功能可由设计者自己定义。四、总体设计1.服务器功能服务器共有

7、四块共享内存,分别用addr1,addr2,addr3,addr4接收,其中addr1为整形指针,addr1,addr2,addr3为结构体型指针,结构体的定义如下:Typedef strcut addressInt mark; Char ch20;address;其中的mark成员用来作为标记为标示共享内存块的状态,-1表示该内存块空闲,服务端可以发送服务请求,1,2,3这分别表示服务器正在处理不同的服务请求,客户端需等待。而字符数组成员ch则用来将各个客户端的文件中的数据放入对应的共享内存块中,与服务器交换数据。而内存块之所以既能实现客户端与服务器的通信,又能相互之间交换数据,在于shma

8、t函数的返回值为void*,可以将其转化为任意类型的指针变量,该函数调用如下:Addr1=(address*)shmat(shmid1,1024,0);Addr2=(address*)shmat(shmid2,1024,0);Addr3=(address*)shmat(shmid31024,0);该四块共享内存分别用于实现接受各个客户端的服务请求,处理客户端1,客户端2,客户端3的服务请求。各个共享内存模块的处理方法基本一致,即服务器处理完客户端的请求,将addr置为-1,即表示自己已空闲,可以接受服务请求;客户端发出服务请求后,等待服务器处理,一旦服务得到相应,将addr置为1或2或3。2.

9、客户端功能可具体分成3个客户端,每个客户端均包含两块共享内存,第一块用于发送请求,其键值为各个客户端所知,第二块用于与服务器交互阶段的数据传递,其键值仅有本客户端与服务器知道。每块共享内存一包含两部分:1用于表示共享内存块的状态的addr1-mark,2用于保存本客户端数据信息的数据域。其所在的进程完成自己的请求后,调用exit(0)退出本进程。其分配共享内存块的系统的调用函数为:Shmid1=shmget(SHMKEY,1024,0777|IPC_CREAT);Shmid2=shmget(SHMKEY,1024,0777|IPC_CREAT);Shmid3=shmget(SHMKEY,102

10、4,0777|IPC_CREAT);至于内存共享的实现方式,与服务器相同。3.文件读取功能 每个客户端均设置此功能,例如购买手机卡时,客户端1需检索自己的文件中是否存在该号码,如果已存在,则提示客户改号码已注册,需重新选择。该功能模块涉及到:1读文件2查找对于读文件,首先需打开文件,该函数定义一个文件型指针fp,赋值操作为:Fp=fopen(“Info.txt”,”rw+”);打开文件成功后,利用fgetc()函数从文件中一个一个字符的读取,当遇到n时,说明一个号码已经读取完毕。其函数使用如下:C=fgetc();While(!feof(fp)If(c=n) Numberi=0; I=-1;E

11、lse Numberi=c;C=fgetc();+I;对于本系统的检索功能,因为文件的读取操作较慢,很有可能使客户端进程阻塞,故设置一个cellnumber()函数,使其预先将本文件中的所有号码全部读出,放入一个字符型二维数组中,这样当服务器需检索文件中号码时,直接从该二维数组中检索即可,大大提高了检索速度。检索所采用的方法是顺序查找法,可以达到预定的速度要求。4.界面显示函数 即系统中的display()函数,其包含四个功能选项:1:购买手机卡;2:手机充值;3;办理网银;4:;退出本系统前三项功能每一项对应一个客户进程,具体哪项进程由choice变量控制。5.组成框图: 总体服务 3个客户

12、端 display() cellnumber() 服务器端6.共享内存分配 共享内存区 -1 由SERVER端开辟一块用来与各个客户端通信的共享内存区 共享内存区-1 客户1与服务器端共享内存区。 共享内存区-1 客户2与服务器端共享内存区共享内存区-1 客户3与服务器端共享内存区。7.总体流程图 Y N Y N Y N 总体流程图1五、详细设计1.主函数int main() int choice,i; char ch520; display(); do printf(请选择一项功能项:n); scanf(%d,&choice); fflush(stdin); while(choice!=1&

13、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.菜单显示void display() printf(-n); int i; for(i=1;imakr=-

14、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(号码已经占用,请重新选择一个:n); return ; else numberi=c; c=fgetc(fp); +i; printf(手机号码已选定,请缴费100元:n); addr1-makr=-1; while(addr1-makr=-1); if(addr1-makr=2) printf(交易完成,祝您愉快!

15、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; while(addr2-makr=-1); if(addr2-makr=2) printf(充值完成!n); shmctl(shmi

16、d2,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-makr=2) printf(办理完成,祝您愉快!n); shmctl(shmid3,IPC_RMID,0); s

17、hmctl(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

18、-makr!=-1); 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-makr!=-1); scanf(%d,&payroll); addr2-makr

19、=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;5.部分函数介绍1.int fork()创建一个新进程。用法: int fork()其中返回int取值意义如下:0:创建子进程,从子进程返回的id值0:从父进程返回的子进程id值-1:创建失败2.

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

21、内存的标号。3.void *shmat(int shmid,const void *shmaddr,int shmflg)头文件: #include #include参数定义:shmid:表示申请共享内存空间的标示符。shmaddr:指定共享内存出现在进程内存地址什么位置,直接指定为NULL让内核自己决定一个合适的位置shmflg:SHM_RDONLY为只读模式,其他为读写模式。返回值为共享内存的首地址。4.int shmctl(int shmid,int cmd,strucr shmid_ds *buf)头文件: #include #include参数定义:Shmid:共享内存标识符。该系统

22、使用了内存共享机制来实现进程之间的通信与数据传递,其包含四个大的功能模块:1:服务器功能,即server函数;2:客户端功能,即client函数;3:读取各个客户端文件功能,即cellnumber函数4:界面显示函数,即display函数下面是每个功能模块的具体分析过程:六、调试与测试任务一编译方法: 编译:cc liulong.c执行:./a.out任务二编译方法是:编译: cc o endend endend.c执行./endend运行时,根据选择不同的功能选项来启动不同客户端,而server端作为服务器仍将继续运行,你再次启动client来请求服务。七、执行结果及分析当选这功能项1时,客

23、户1与服务器建立共享区来建立通信,这里用到了和文件相关联,在当前目录下有一个文件,文件中有五条电话号码记录,当客户选择自己的电话号码是如果输入的电话号码和文件中五条记录中的一项相同就会弹出“手机号码已存在,请重新选择!”这句话也就是说该号码已被别人注册并使用,提示用户重新选择自己的号码。通过编译后进入该程序,如果输入的不是当前功能项提供的几个选项会弹出来错误提示,提示用户重新输入想要选择的功能项,这里用到了fflush(stdin)这个函数,当输入有误时会清除掉缓冲区中的数据以便于用户再次输入。当选择功能项2时,这是一个为用户充值的服务,选中该功能项时客户端2会和服务器建立基于共享内存的通信,

24、这是用户可以输入自己的电话号码,这里也可以关联到文件,可以在当前目录下创建一个文件,其中记录了用户的电话号码和对应的余额,根据这个来为用户提供要充值的服务。当选择功能项3时,这是一个为用户办理网银的服务,该功能也可以和文件相关联,在当前目录下建立一个文件其中记录了用户的电话号码、身份证号,根据用户输入共享区的数据,把共享区中的数据取出和文件中已存在的数据作比较,可以得到是否该用户已存在进而来为用户提供办理网银的服务。当各项功能服务都不需要时,可以选择退出本系统,选择功能项4时自动退出本服务系统。八、源程序清单#include#include#include#include#include#de

25、fine SHMKEY 75#define CLIENTONE 100#define CLIENTTWO 150#define CLIENTTHREE 200void cellnumber(char phonenumber520) int j=0; char c; char number20=0; FILE *fp; if(fp=fopen(Info.txt,rw+)=NULL) printf(文件未能打开!n); return ; c=fgetc(fp); int i=0; while (!feof(fp) if(c=n) numberi=0; i=-1; strcpy(phonenumberj,number); j+; else numberi=c; c=fgetc(fp); +i; typedef struct addreint makr;char ch50;addre;addre *addr1,*addr2,*addr3;int shmid,*addr;void server(char phonenumber520) char ch120; int shmid1,shmid2,shmid3,shmid4; int i

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1