实验一进程间通信

实验一进程间通信

ID:38172287

大小:80.50 KB

页数:4页

时间:2019-05-24

实验一进程间通信_第1页
实验一进程间通信_第2页
实验一进程间通信_第3页
实验一进程间通信_第4页
资源描述:

《实验一进程间通信》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、进程间通信班级:网络081姓名:甘春泉学号:2008008241264实验一进程间通信一、实验目的在本实验中,通过对文件映射对象的了解,来加深对Windows2000线程同步的理解.回顾系统进程、线程的有关概念,加深对Windowsxp线程间通讯的理解;了解文件映射对象;通过分析实验程序,了解线程如何通过文件映射对象发送数据;了解在进程中如何使用文件映射对象.二、背景知识共享内存:Windowsxp提供了一种在文件中处理数据的方法,名为内存映射文件,也称为文件映射.文件映射对象是在虚拟内存中分配的永

2、久或临时文件对象区域(如果可能的话,可大到整个文件),可将其看作是二进制的数据块.使用这类对象,可获得直接在内存中访问文件内容的能力.文件映射对象提供了强大的扫描文件中数据的能力,而不必移动文件指针.对于多线程的读写操作来说,这一点特别有用,因为每个线程都可能想要把读取指针移动到不同的位置去——为了防止这种情况,就需要使用某种线程同步机制保护文件.在CreateFileMapping()API中,一个新的文件映射对象需要有一个永久的文件对象(由CreateFile()所创建).该函数使用标准的安全性

3、和命名参数,还有用于允许操作(如只读)的保护标志以及映射的最大容量.随后可根据来自OpenFileMapping()API的其他线程或进程使用该映射——这与事件和互斥体的打开进程是非常类似的.内存映射文件对象的另一个强大的应用是可请求系统创建一个运行映射的临时文件.该临时文件提供一个临时的区域,用于线程或进程互相发送大量数据,而不必创建或保护磁盘上的文件.利用向创建函数中发送INVALID_HANDLE_VALUE来代替真正的文件句柄,就可创建这一临时的内存映射文件;指令内核使用系统页式文件来建立支

4、持映射的最大容量的临时数据区.为了利用文件映射对象,进程必须将对文件的查看映射到它的内存空间中.也就是说,应该将文件映射对象想象为进程的第一步,在这一步中,当查看实际上允许访问的数据时,附加有共享数据的安全性和命名方式.为了获得指向内存区域的指针需要调用MapViewOfFile()API,此调用使用文件映射对象的句柄作为其主要参数.此外还有所需的访问等级(如读-写)和开始查看时文件内的偏移和要查看的容量.该函数返回一个指向进程内的内存的指针,此指针可有多种编程方面的应用(但不能超过访问权限).当结

5、束文件映射查看时,必须用接受到的指针调用UnmapViewOfFlie()API,然后再根据映射对象调用CloseHandle()API,从而将其清除二、实验内容1.编译运行项目Lab5.1SHAREMEM.DSW,观察运行结果,并阅读和分析实验程序.42.Lab5.2目录下的示例程序:ProcessA.exe,ProcessB.exe用三种方法实现了进程通信.(1)进程A中输入一些字符,点“利用SendMessage发送消息”按钮可将消息发到进程B.(2)在进程A中输入一些字符,点“写数据到内存

6、映像文件”按钮,然后在进程B中点“从内存映像文件读数据”按钮可收到消息.(3)先在进程B中点“创建管道并接收数据”按钮,然后在进程A中输入一些字符,点“写数据到管道文件”按钮可将消息发到进程B(重复第3步每次可发一条消息).消息传递数据通信可参考SendMessage.txt,共享内存通信可参考MemFile.txt,管道通信可参考Pipe.txt.3.编写程序利用WM_COPYDATA消息机制,实现线程间的通信.4关键代码如下:发送端:voidCSendDataDlg::OnBtSend()//实

7、现CString类型数据的发送{UpdateData(TRUE);if(m_szData.IsEmpty()){m_szData=_T("Hello");UpdateData(FALSE);}HWNDhWndRcv=::FindWindow(NULL,"Receiver");if(hWndRcv==NULL){AfxMessageBox(_T("找不到接收窗口,发送不成功"));return;}COPYDATASTRUCTcpd;cpd.dwData=STRING;//标志为CString类型cpd

8、.cbData=m_szData.GetLength()+1;//GetLength()只是取得实际字符的长度,没有包括''.cpd.lpData=(void*)m_szData.GetBuffer(cpd.cbData);::SendMessage(hWndRcv,WM_COPYDATA,(WPARAM)this->m_hWnd,(LPARAM)&cpd);m_szData.ReleaseBuffer();AfxMessageBox(_T("发送成功"));}接

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。