实验一 进程间通信 .pdfVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

班级:网络081

姓名:甘春泉

学号:200800824126

1

实验一进程间通信

一、实验目的

在本实验中,通过对文件映射对象的了解,来加深对Windows2000线程同步的理解.

回顾系统进程、线程的有关概念,加深对Windowsxp线程间通讯的理解;了解文件映射对

象;通过分析实验程序,了解线程如何通过文件映射对象发送数据;了解在进程中如何使用

文件映射对象.

二、背景知识

共享内存:Windowsxp提供了一种在文件中处理数据的方法,名为内存映射文件,也

称为文件映射.文件映射对象是在虚拟内存中分配的永久或临时文件对象区域(如果可能的

话,可大到整个文件),可将其看作是二进制的数据块.使用这类对象,可获得直接在内存

中访问文件内容的能力.

文件映射对象提供了强大的扫描文件中数据的能力,而不必移动文件指针.对于多线程

的读写操作来说,这一点特别有用,因为每个线程都可能想要把读取指针移动到不同的位置

去——为了防止这种情况,就需要使用某种线程同步机制保护文件.

在CreateFileMapping()API中,一个新的文件映射对象需要有一个永久的文件对象

(由CreateFile()所创建).该函数使用标准的安全性和命名参数,还有用于允许操作(如

只读)的保护标志以及映射的最大容量.随后可根据来自OpenFileMapping()API的其他线

程或进程使用该映射——这与事件和互斥体的打开进程是非常类似的.

内存映射文件对象的另一个强大的应用是可请求系统创建一个运行映射的临时文件.该

临时文件提供一个临时的区域,用于线程或进程互相发送大量数据,而不必创建或保护磁盘

上的文件.利用向创建函数中发送INVALID_HANDLE_VALUE来代替真正的文件句柄,就可创建

这一临时的内存映射文件;指令内核使用系统页式文件来建立支持映射的最大容量的临时数

据区.

为了利用文件映射对象,进程必须将对文件的查看映射到它的内存空间中.也就是说,

应该将文件映射对象想象为进程的第一步,在这一步中,当查看实际上允许访问的数据时,

附加有共享数据的安全性和命名方式.为了获得指向内存区域的指针需要调用

MapViewOfFile()API,此调用使用文件映射对象的句柄作为其主要参数.此外还有所需的访

问等级(如读-写)和开始查看时文件内的偏移和要查看的容量.该函数返回一个指向进程

内的内存的指针,此指针可有多种编程方面的应用(但不能超过访问权限).

当结束文件映射查看时,必须用接受到的指针调用UnmapViewOfFlie()API,然后再根

据映射对象调用CloseHandle()API,从而将其清除

二、实验内容

1.编译运行项目Lab5.1\SHAREMEM.DSW,观察运行结果,并阅读和分析实验程序.

2

2.Lab5.2目录下的示例程序:ProcessA.exe,ProcessB.exe用三种方法实现了进程通信.

(1)进程A中输入一些字符,点“利用SendMessage发送消息”按钮可将消息发到进程B.

(2)在进程A中输入一些字符,点“写数据到内存映像文件”按钮,然后在进程B中点“从

内存映像文件读数据”按钮可收到消息.

(3)先在进程B中点“创建管道并接收数据”按钮,然后在进程A中输入一些字符,点“写

数据到管道文件”按钮可将消息发到进程B(重复第3步每次可发一条消息).

消息传递数据通信可参考SendMessage.txt,共享内存通信可参考MemFile.txt,管道

通信可参考Pipe.txt.

3.编写程序利用WM_COPYDATA消息机制,实现线程间的通信.

3

关键代码如下:

发送端:

voidCSendDataDlg::OnBtSend()//实现CString类型数据的发送

{UpdateData(TRUE);

if(m_szData.IsEmpty())

文档评论(0)

189****9718 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档