河南城建学院《操作系统》课程设计说明书设计题目:进程通信专业:计算机科学与技术指导教师:邵国金、郭猛、薛冰班级:学号:姓名:同组人:计算机科学与工程系2013年1月10日-2-前言本设计是基于课程中学到的UNIX系统调用,使用操作系统环境是RedHatLinux9,言语开发环境是Linux的GNUC或C++。Linux操作系统是一个向用户开放源码的免费的类UNIX操作系统。它为在校学生学习操作系统课程提供了一个看得见摸得着的范例。对于学生正确理解,掌握操作系统的基本知识具有重要意义。鉴于此,本操作系统课程涉及的实验均在Linux环境下进行。这就要求大家:(1)熟悉Linux的操作和开发环境;(2)具有C语言知识(Linux操作系统大约90%的源码是用C语言编写)。我们的设计和实验将在Windowsxp环境下,基于虚拟机软件VMWare软件进行安装。学习计算机软件技术,特别是计算机操作系统技术,除了需要刻苦努力外,还需要掌握软件和操作系统的原理与设计技巧。如何学习和掌握操作系统技术的原理与实际技巧呢?除了听课和读书之外,最好的方法恐怕就是在实践中练习。例如,自己设计一个小型操作系统,多使用操作系统,多阅读和分析操作源代码等。但由于我们的条件和学时有限,在理论学习过程中没有给同学们提供更多的实验机会。基于共享内存的进程通信,通过在两个进程间创建一块共享内存,将共享内存块分为两部分,标示位和数据域。通过实践让我们了解了什么是共享内存通信机制,实现了程序进程间的通信。积极通过合作,完成任务。-3-目录一、系统开发环境...................................................................................................-4-二、设计目的...........................................................................................................-5-三、设计题目及要求...............................................................................................-6-四、总体设计...........................................................................................................-7-1、服务器功能..................................................................................................-7-2、客户端功能..................................................................................................-7-3、文件读取功能..............................................................................................-8-4、界面显示函数..............................................................................................-8-5、组成框图:..................................................................................................-9-6.共享内存分配.................................................................................................-9-7.总体流程图...................................................................................................-10-五、详细设计.........................................................................................................-11-1.主函数...........................................................................................................-11-2.菜单显示.......................................................................................................-12-3.服务器端:...................................................................................................-12-4.客户端程序:...............................................................................................-14-5、部分函数介绍............................................................................................-15-六、调试与测试.....................................................................................................-17-七、执行结果及分析.............................................................................................-18-八、源程序清单.....................................................................................................-20-九、心得体会.........................................................................................................-25-十、参考文献.........................................................................................................-26--4-一、系统开发环境WindowsXp系统、虚拟机上运行的RedHatLinux9系统运行环境。-5-二、设计目的1、进一步了解什么是进程,以及创建进程的方式。2、实现UNIX/LINUX系统环境下的进程通信方式。3、熟练掌握C/S中的共享内存通信机制。4、开辟一个共享区,实现进程共享资源,互相通信。-6-三、设计题目及要求利用UNIX系统提供的进程通信机制实现通信以及共享内存区的实现(1)共享存储区的创建,附接和断接使用系统调用shmget(),shmat(),msgdt(),shmctl(),编制一长度为1K的消息发送和接收的程序。1)为了便于操作和观察结果,用一个程序作为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。SERVER和CLIENT也可分别为2个各自独立的程序。2)SERVER端建立一个Key为375的共享区,并将第一个字节置为-1,作为数据空的标志,等待其他进程发来的消息。当该字节的值发生变化时,表示收到了信息,并进行处理。然后再次把它的值设为-1。如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER。SERVER每接收到一次数据后显示“(server)received”。3)CLIENT端建立一个Key为375的共享区,当共享取得第一个字节为-1时,SERVER端空闲,可发送请求。CLIENT随即填入9到0。期间等待Server端的再次空闲。进行完这些操作后,CLIENT退出。CLIENT每发送一次数据后显示“(client)sent”。4)父进程在SERVER和CLIENT均退出后结束。(2)功能扩展:在sever端创建一个服务函数,从而形成C/S通讯模式要求SERVER每接收到一次数据后不仅仅显示“(server)received”,而是做一些其它事情,比如读取或查询某个文件等。此功能可由设计者自己定义。-7-四、总体设计1.服务器功能服务器共有四块共享内存,分别用addr1,addr2,addr3,addr4接收,其中addr1为整形指针,addr1,addr2,addr3为结构体型指针,结构体的定义如下:Typedefstrcutaddress{Intmark;Charch[20];}address;其中的mark成员用来作为标记为标示共享内存块的状态,-1表示该内存块空闲,服务端可以发送服务请求,1,2,3这分别表示服务器正在处理不同的服务请求,客户端需等待。而字符数组成员ch则用来将各个客户端的文件中的数据放入对应的共享内存块中,与服务器交换数据。而内存块之所以既能实现客户端与服务器的通信,又能相互之间交换数据,在于shmat函数的返回值为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.客户端功能可具体分成3个客户端,每个客户端均包含两块共享内存,第一块用于发送请求,其键值为各个客户端所知,第二块用于与服务器交互阶段的数据传递,其键值仅有本客户端与服务器知道。每块共享内存一包含两部分:1用于表示共享内存块的状态的addr1-mark,2用于保存本客户端数据信息的数据域。其所在的进程完成自己的请求后,调用exit(0)退出本进程。其分配共享内存块的系统的调用函数为:Shmid1=shmget(SHMKEY,1024,0777|IPC_CREAT);Shmid2=shmget(SHMKEY,1024,0777|IPC_CREAT);Shmid3=shmget(SHMKEY,1024,0777|IPC_CREAT);;至于内存共享的实现方式,与服务器相同。-8-3.文件读取功能每个客户端均设置此功能,例如购买手机卡时,客户端1需检索自己的文件中是否存在该号码,如果已存在,则提示客户改号码已注册,需重新选择。该功能模块涉及到:1读文件2查找对于读文件,首先需打开文件,该函数定义一个文件型指针fp,赋值操作为:Fp=fopen(“Info.txt”,”rw+”);打开文件