进程通信调试实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

嵌入式操作系统实验指导书实验四进程通信调试实验[实验目的]1、掌握WinCE5.0下进程间通信机制;2、掌握通过对消息传递和共享内存的实现进程间通信的方法;3、了解实现进程通信的编程方法[实验仪器]1、装有PlatformBuilder、EVC和VS.Net开发平台的PC机一台2、XSBase270实验开发平台一套[实验原理]1、软件原理:在项目开发和系统集成中,进程间通信的应用非常广泛,进程间的通信有以下几种实现方法:利用Windows消息(WM_COPYDATA)、全局原子、内存映射、命名管道以及邮曹。下面介绍利用WM_COPYDATA和内存映射实现进程通信的方法。1.1WM_COPYDATA方法使用WM_COPYDATA消息可以很方便地传递进程间的数据,具体定义如下:SendMessage(hwnd,WM_COPYDATA,wParam,lParam);其中wParam设置为包含数据的窗体的句柄,lParam指向一个COPYDATASTRUCT的结构:typedefstructtagCOPYDATASTRUCT{DWORDdwData;//用户定义数据DWORDcbData;//数据大小PVOIDlpData;//指向数据的指针}COPYDATASTRUCT也就是通过COPYDATASTRUCT的结构来传递数据。需要注意的是,WinCE提供的WM_COPYDATA消息来传递进程间的数据,并没有提供同步机制,所以必须要使用SendMessage函数来发送消息,且等待直到对方处理完后返回,而不能使用PostMessage函数来发送WM_COPYDATA。1.2内存映射文件的方法内存映射文件提供了一种完全不同的读写文件的方法,它是将文件内容映射到内存的某个区域,读写文件直接操作内存即可。下面介绍内存映射文件所需的API函数:(1)创建用于内存映射访问的文件在WinCE中,要想创建或打开一个用于内存映射访问的文件,需要通过CreateFileForMapping函数来实现,它是CreateFile函数的一个特殊版本,专门提供给内存嵌入式操作系统实验指导书映射文件使用,CreateFileForMapping函数的定义如下:HANDLECreateFileForMapping(LPCTSTRlpFileName,DWORDdwDesiredAccess,DWORDdwShareMode,LPSECURITY_ATTRIBUTESlpSecurityAttributes,DWORDdwCreationDisposition,DWORDdwFlagsAndAttributes,HANDLEhTemplateFile);(2)创建或打开内存映射文件对象在使用内存映射文件时,需要创建或打开内存映射文件对象,它实际上是于已经创建或打开的文件建立连接。创建或打开内存映射对象通过CreateFileMapping函数实现,此函数定义如下:HANDLECreateFileMapping(HANDLEhFile,LPSECURITY_ATTRIBUTESlpFileMappingAttributes,DWORDflProtect,DWORDdwMaximumSizeHigh,DWORDdwMaximumSizeLow,LPCTSTRlpName);成功创建内存映射文件对象,函数将返回一个内存映像对象句柄,如果在创建内存映射文件对象已存在,将直接返回已打开的内存映像文件对象句柄。(3)获取内存映像文件对象视图当创建或打开了内存映射对象之后。接着就需要得到内存映射文件对象的数据内存指针,通过此指针则可以读写文件中的内容,也就是获取内存映射文件对象视图。得到内存映射文件对象的数据内存指针通过MapViewOfFile函数实现,此函数定义如下:LPVOIDMapViewOfFile(HANDLEhFileMappingObject,DWORDdwDesiredAccess,DWORDdwFileOffsetHigh,DWORDdwFileOffsetLow,DWORDdwNumberOfBytesToMap);函数返回值指向映射文件的内存指针。(4)取消文件视图的映射在使用完内存映射文件之后,还要调用UnmapViewOfFile函数取消文件视图,进行内存清理工作。此函数定义如下:BOOLUnmapViewOfFile(LPCVOIDlpBaseAddress);嵌入式操作系统实验指导书2、进程通信的实现2.1WM_COPYDATA方法Client端的实现voidCClientDlg::OnBnClickedbtnsendmessage(){CStringstr=_T(Server);CWnd*pWnd=CWnd::FindWindow(NULL,str);UpdateData(TRUE);if(pWnd&&m_msg!=_T()){COPYDATASTRUCTbuf;buf.lpData=m_msg.GetBuffer(m_msg.GetLength());buf.cbData=m_msg.GetLength()*2;pWnd-SendMessage(WM_COPYDATA,0,LPARAM(&buf));}elseMessageBox(_T(NosuchMessage));}Server端的实现方法:BOOLCServerDlg::OnCopyData(CWnd*pWnd,COPYDATASTRUCT*pCopyDataStruct){m_RecvData=LPCTSTR(pCopyDataStruct-lpData);UpdateData(FALSE);returnCDialog::OnCopyData(pWnd,pCopyDataStruct);}2.2内存映射方法Client端的实现voidCClientDlg::OnBnClickedbtnsendtomem(){HANDLEhMapping;LPTSTRlpData;hMapping=CreateFileMapping(HANDLE(0xFFFFFFFF),NULL,PAGE_READWRITE,0,1024,_T(MyShare));if(hMapping==NULL){AfxMessageBox(_T(CreateFileMappingFailed));return;}lpData=(LPTSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);if(lpData==NULL){AfxMessageBox(_T(MapViewOfFileFailed));嵌入式操作系统实验指导书return;}UpdateData(TRUE);if(m_msg!=_T())wsprintf(lpData,m_msg);elseAfxMessageBox(_T(Messageisempty!));}Sever端的实现:voidCServerDlg::OnBnClickedbtnopen(){HANDLEhMapping;LPTSTRlpData;hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,1024,_T(MyShare));if(hMapping==NULL){AfxMessageBox(_T(CreateFileMappingfailed));return;}lpData=(LPTSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);if(lpData==NULL){AfxMessageBox(_T(MapViewOfFilefailed));return;}m_MapFileMessage=lpData;UpdateData(FALSE);::UnmapViewOfFile(lpData);CloseHandle(hMapping);[实验内容]1、掌握WinCE5.0下进程间通信机制;2、掌握通过对消息传递和共享内存的实现进程间通信的方法;3、了解实现进程通信的编程方法;4、掌握EVC或VS.net编程方法[实验步骤]第一步:连接好实验系统,打开实验箱电源。嵌入式操作系统实验指导书第二步:分别利用VisualStudio2005.net打开进程通信的Client和Sever工程文件Client.sln和Server.sln,进行编译:第三步:分别编译Client和Sever代码,点击运行按钮,这样程序就会下载到XSBase270目标板板上运行。Client和Sever运行界面分别如图4-1、4-2所示。图4-1Client端运行界面图4-2Sever端运行界面第四步:进程通信调试实验程序操作过程在XSBase270目标板上同时运行Sever和Client程序,当单击Client端的“SendMessage”按钮时,程序采用WM_COPYDATA消息实现进程通信,此时Sever端将接受Client发送的消息内容;单击Client端的“SendToMeme”按钮时,程序利用内存映射实现进程通信,Client端将通信内容映射到内存文件中,此时单击Sever端的“OpenMemoryMap”按钮,通过打开内存映射文件读出通信内容。[习题与思考题]1、如果需要采用具体文件实现进程通信,怎样实现?嵌入式操作系统实验指导书2、比较利用SendMessage发送消息和PostMessage发送消息的区别?分析为什么进程通信不能采用PostMessage来实现?

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功