当前位置:首页 > Windows程序 > 正文

Windows进程间各种通信方式浅谈

2021-03-26 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,那么进程就可以假设这一共享内存区 域已经被别的进程打开并初始化了,  

  

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/68147.html