- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Windows进程间各种通信方式浅谈1、Windows进程间通信的各种方法??进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。??多进程/多线程是Windows操作系统的一个基本特征。Microsoft?Win32应用编程接口(Application?Programming?Interface,?API)??提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess?Communication,?IPC),??进程通信就是指不同进程间进行数据共享和数据交换。??正因为使用Win32?API进行进程通信方式有多种,如何选择恰当的通信方式就成为应用开发中的一个重要问题,??下面本文将对Win32中进程通信的几种方法加以分析和比较。??2、?进程通信方法??2.1?文件映射??文件映射(Memory-Mapped?Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,??只需简单的指针操作就可读取和修改文件的内容。??Win32?API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,??实现了对文件中数据的共享。??应用程序有三种方法来使多个进程共享一个文件映射对象。??(1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。??(2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。??另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。??(3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。??第二个进程复制该句柄就取得对该文件映射对象的访问权限。??文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中??,而开发者还必须控制进程间的同步。??2.2?共享内存??Win32?API中共享内存(Shared?Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替?文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用?文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。??a.设定一块共享内存区域??HANDLE?CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES,?DWORD,?DWORD,?DWORD,?LPCSTR)//?产生一个file-mapping核心对象??LPVOID?MapViewOfFile(???HANDLE?hFileMappingObject,???DWORD?dwDesiredAcess,???DWORD?dwFileOffsetHigh,???DWORD?dwFileOffsetLow,???DWORD?dwNumberOfBytesToMap??);得到共享内存的指针??b.找出共享内存??决定这块内存要以点对点(peer?to?peer)的形式呈现每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程都应该调用CreateFileMapping(),??然后调用GetLastError().如果传回的错误代码是?ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区?域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己?排在第?一位,并接下来将共享内存初始化。还是要使用client/server架构中只有server进程才应该产生并初始化共享内存。??所有的进程都应该使用??HANDLE?OpenFileMapping(DWORD?dwDesiredAccess,??BOOL?bInheritHandle,??LPCTSTR?lpName);??再调用MapViewOfFile(),取得共享内存的指针??c.同步处理(Mutex)??d.清理(Cleaning?up)?BOOL?UnmapViewOfFile(LPCVOID?lpBaseAddress);??CloseHandle()??2.3?匿名管道??管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两
文档评论(0)