操作系统进程创建及通信实验报告_第1页
操作系统进程创建及通信实验报告_第2页
操作系统进程创建及通信实验报告_第3页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、武汉工程大学计算机科学与工程学院操作系统实验报告I专业班级计算机工程02班实验地占5号机房学生学号1005080214指导教师张立学生姓名刘子龙实验时间2012-12-13实验项目创建进程及进程通信实验类别操作性()验证性()设计性(2)综合性()其它()实验求目的及要实验目的及要求:创建进程,实现消息通信和共享内存通信。了解进程的创建、退出和获取进程信息。掌握通过内存印象文件和管道技术实现进程通信。成绩评定表类另y评分标准分值得分合计上机表现积极出勤、遵守纪律认真完成实验任务30分报告质量程序代码规范、功能止确填写内容完整、体现收获70分说明:评阅教师:日期:2012年月日一、实验目的创建进

2、程,实现进程消息通信和共享内存通信,了解进程的创建、退出和获取进程信。了解什么是映像文件、管道通信及其作用,掌握通过内存映像文件和管道技术实现进程通信。二、实验内容本例用三种方法实现进程通信,仅用于示例目的,没有进行功能优化。1、创建进程A和B后,在进程A中输入一些字符,点“利用SendMessag发送消息”按钮可将消息发到进程B。2、在进程A中输入一些字符,点“写数据到内存映像文件”按钮,然后在进程B中点“从内存映像文件读数据”按钮可收到消息。其中在点“写数据到内存映像文件”时,要求创建映像文件,B进程在印象文件中读取数据。3、先在进程B中点“创建管道并接收数据”按钮,然后在进程A中输入一些

3、字符,点“写数据到管道文件”按钮可将消息发到进程B。管道是连接读/写进程使他们进行通信的一个共享文件,目的是更好地实现进程间的通信。三、实验思想这次试验最主要的内容和核心思想就是学会创建进程并实现进程间的简单通信、创建映像文件和创建管道文件来通信,后两者是实现进程通信的高级通信机制中的两种。创建一个程序A和程序B,其中程序A和B各有一个主窗体,A主窗体上要求可以实现创建进程B(即调用函数B)、结束进程B、关闭进程A、向进程B发送数据、创建映像文件、创建管道文件等功能,进程B要求有从映像文件读取数据、创建管道并接收数据、结束进程B功能。最终让A、B进程相互通信。四、设计分析:首先设得设计A、B两

4、个程序的操作界面,然后编写各个功能模块。对于A程序窗体,在“利用SendMessag发送消息”按钮的消息响应函数中,主要是利用WindowsAPI函数CWnd:FindWindo来找到接收消息的窗体,即进程B,找到进程B后,利用这个函数返回的窗体指针的SendMessa函数来发送消息。在“写数据到内存印象文件”按钮的消息响应函数中,主要是利用函数CreateFileMappin来创建一个印象文件,这个函数返回的是这个印象文件的句柄,然后将这个句柄和要发送的消息字符串传递到函数sprintf中,就可以所要发送的消息写入印象文件,在B程序窗体中有个“从内存印象文件读数据”按钮,在这个按钮的消息响应

5、函数中读取父进程所创建的印象文件中的数据就可以实现通信了。在B程序窗体按钮“写数据到管道文件”的消息响应函数中,不能直接将要发送的消息发送到管道文件,因为管道必须先由子进程通过函数CreateNamedPipa建,只有待子进程创建好管道后父进程才能根据管道创建管道文件,将消息写入管道文件并及时发送给子进程。而且这个管道只能使用一次,即每次发送完消息后那个管道不能在使用了,必须再由子进程创建一个管道,A进程才能再次创建管道文件并向其中写入消息。这个程序也不一定要MF(实现,还可以用其他的技术和语言实现,比如说JavaVB等,外表构架可以不一样,但核心技术都是一样的,只是不同的调用形式和调用方法,

6、比如说在VB中,实现进程间的一般通信就是使用动态数据交换DDE,实现起来就比较简单,但是要创建映像文件和管道文件就比较繁琐,可以根据不同的需求采用不同的语言。五、程序部分源代码:1.“利用SendMessa发送消息”按钮中的主要代码/找到接收消息的窗口(窗口名为Receiver)CStringstr=进程B"CWnd*pWnd=CWnd:FindWindow(NULL,str);if(pWnd)COPYDATASTRUCTbuf;char*s=newcharm_Msg1.GetLength()/m_Msg1为CString类型的变量s=m_Msg1.GetBuffer(0);buf.

7、cbData=strlen(s)+1;buf.lpData=s;pWnd->SendMessage(WM_COPYDATA,0,(LPARAM)传送大量数据要用WM_COPYDA消息2创建内存映像对象主要代码HANDLEhMapping;LPSTRlpData;hMapping=CreateFileMapping(HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x200,"MYSHARE"if(hMapping=NULL)AfxMessageBox("CreateFileMapping()failed.");ret

8、urn;LPVOI荧型的内存指针.ALL_ACCESS,0,0,0);/将文件的视图映射到一个进程的地址空间上,返回lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAPif(lpData=NULL)AfxMessageBox("MapViewOfFile()failed.");return;/给这段映像内存写数据sprintf(lpData,m_Msg1);/释放映像内存UnmapViewOfFile(lpData);3利用管道发送消息的主要代码客户端:#include<stdio.h>#definePIPE_NAME&qu

9、ot;cqu-zlhPipezhj"voidmain(void)HANDLEPipeHandle;DWORDBytesWritten;if(WaitNamedPipe(PIPE_NAME,NMPWAIT_WAIT_FOREVER)=0)printf("WaitNamedPipefailedwitherror%dn",GetLastError();return;/Createthenamedpipefilehandie/总是这里出错?if(PipeHandle=CreateFile(PIPE_NAME,GENERIC_READ|GENERIC_WRITE,0,(LP

10、SECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL)=INVALID_HANDLE_VALUE)printf("CreateFilefailedwitherror%dn",GetLastError();return;if(WriteFile(PipeHandle,"Thisisatest",14,&BytesWritten,NULL)=0)printf("WriteFilefailedwitherror%dn",GetLastErr

11、or();CloseHandle(PipeHandle);return;printf("Wrote%dbytes",BytesWritten);CloseHandle(PipeHandle);服务器端:DWORDWINAPIPipeInstanceProc(LPVOIDlpParameter)HANDLEPipeHandle;DWORDBytesRead;DWORDBytesWritten;CHARBuffer256;staticinti;if(PipeHandle=CreateNamedPipe(".PIPEjim",PIPE_ACCESS_DUPLE

12、X,PIPE_TYPE_BYTE|PIPE_READMODE_BYTE,NUM_PIPES,1024,1024,2000,NULL)=INVALID_HANDLE_VALUE)printf("CreateNamedPipefailedwitherror%dn",GetLastError();return0;/Serveclientconnectionsforeverwhile(1)if(ConnectNamedPipe(PipeHandle,NULL)=0)printf("ConnectNamedPipefailedwitherror%dn",GetLa

13、stError();break;/Readdatafromandechodatatotheclientuntil/theclientisreadytostopwhile(ReadFile(PipeHandle.Buffer,sizeof(Buffer),&BytesRead,NULL)>0)printf("Echo%dbytestoclientn",BytesRead);printf("thethread%d",i+);if(WriteFile(PipeHandle.Buffer,BytesRead,&BytesWritten,NU

14、LL)=0)printf("WriteFilefailedwitherror%dn",GetLastError();break;if(DisconnectNamedPipe(PipeHandle)=0)printf("DisconnectNamedPipefailedwitherror%dn",GetLastError();break;CloseHandle(PipeHandle);return0;六、测试用例:(1) 运行进程A,点击“创建进程B按钮”创建一个进程B,如下图2d2d从内存映像文件讳数据创建管道并接收数扌居退出一在进程A的静态文本框中输入

15、“liuzilong”点击“利用SendMessa发送消息”按钮,可以在进程B中收到这个消息,运行结果如下图所示:图2图3(2) 在进程A的静态文本框中输入“hello”,点击“写数据到内存印象文件”按钮,在进程B中点击“从内存印象文件读数据”,将收到这个消息,运行结果如下图所示:图4(3) 在进程A的静态文本框中输入“world”,点击“写数据到管道文件”按钮,将会发生错误,运行结果如下图所示:主要原因是进程B没有创建管道,点击进程B的“创建管道并接受数据”,然后再在进程A中发送数据到管道文件,进程B就能接收到消息,运行举国如下图所示:图7七、总结这次试验最主要的内容和核心思想就是学会创建进程并实现进程间的简单通信、创建映像文件和创建管道文件来通信,利用MF(编写程序。我开始用的是VB语言,用的技术是动态数据交换DDE就是利用picbox的LinkTopic、LinkModeLinkExecute的三个属性,很容易就实现了进程间的相互通行,比使用MFC简单的多,但后面的创建映像文件和管道文件实现起来就比较复杂,相比于MF(而言,所以后来我又改用了MFC在网络上看了好多这方面的教程,才勉强知道其

温馨提示

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

评论

0/150

提交评论