欢迎来到天天文库
浏览记录
ID:21062669
大小:30.25 KB
页数:11页
时间:2018-10-19
《windows进程间各种通信方式浅谈》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Windows进程间各种通信方式浅谈1、Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。 多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API) 提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC), 进程通信就是指不同进程间进行数据共享和数据交换。 正
2、因为使用Win32 API进行进程通信方式有多种,如何选择恰当的通信方式就成为应用开发中的一个重要问题, 下面本文将对Win32中进程通信的几种方法加以分析和比较。 2、 进程通信方法 2.1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作, 只需简单的指针操作就可读取和修改文件的内容。 Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容, 实现了对文件中数据的共享。 应用
3、程序有三种方法来使多个进程共享一个文件映射对象。 (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。 (2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。 另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。 (3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。 第二个进程复制该句柄就取得对该文件映射对象的访问权限。 文件映射是在多个进程间共享数据的非常有效方法,有较好
4、的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中 ,而开发者还必须控制进程间的同步。 2.2 共享内存 Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替 文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用 文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。 a.设定一块共享内存区域 HANDLE CreateFileMapping(HANDLE,L
5、PSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR)// 产生一个file-mapping核心对象 LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAcess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, DWORD dwNumberOfBytesToMap );得到共享内存的指针 b.找出共享内存 决定这块内存要以点对点(peer to peer)的形式呈现每个进程都必须有相同
6、的能力,产生共享内存并将它初始化。每个进程都应该调用CreateFileMapping(), 然后调用GetLastError().如果传回的错误代码是 ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区 域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己 排在第 一位,并接下来将共享内存初始化。还是要使用client/server架构中只有server进程才应该产生并初始化共享内存。 所有的进程都应该使用 HANDLE OpenFileMapping(DWORD dwDesiredAccess, BOOL bInheritHandle,
7、 LPCTSTR lpName); 再调用MapViewOfFile(),取得共享内存的指针 c.同步处理(Mutex) d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress); CloseHandle() 2.3 匿名管道 管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两
此文档下载收益归作者所有