`
lc52520
  • 浏览: 369151 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

进程间通信【Z】

阅读更多

进程间通信

    随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求。编写多进程 / 多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的。 Microsoft Win32 API 提供了多种进程间通信的方法,全面地阐述了这些方法的特点,并加以比较和分析,希望能给读者选择通信方法提供参考。

进程与进程通信  

  进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源 ( 如文件、管道等 ) 组成。多进程 / 多线程是 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),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用 文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
2.3 匿名管道
  管道(Pipe)是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。
   匿名管道(Anonymous Pipe)是 在父进程和子进程之间,或同一父进程的两个子进程之间传输数据的无名字的单向管道。通常由父进程创建管 道,然后由要通信的子进程继承通道的读端点句柄或写 端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程 可以使用管道直接通信,不需要通过父进程。
  匿名管道是单机上实现子进程标准I/O重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。
2.4 命名管道
   命名管道(Named Pipe)是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不 同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
  命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。
2.5 邮件槽
   邮件槽(Mailslots)提 供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给 邮件槽服务器进程发送消息。进来的消 息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个 邮件槽实现进程间的双向通信。
  通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。
   邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包)完成的,一旦网络发生错误则无法保证消息正确地接收,而 命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,所以邮件槽不失为应用程序发送 和接收消息的另一种选择。
2.6 剪贴板
   剪贴板(Clipped Board)实质是Win32 API中一组用来传输数据的函数和消息,为Windows应用程序之间进行数据共享提供了一个 中介,Windows已建立的剪切(复制)-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应 用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
  剪贴板 是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(预定义)剪贴板格式,该值是Win32 API定义的常量;对非 标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以 转化为某种格式就行。但剪贴板只能在基于Windows的程序中使用,不能在网络上使用。
2.7 动态数据交换
  动态数据交换(DDE)是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。
   DDE和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎 总是用作对用户指定操作的一次性应答-如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE有三 种数据交换方式:
  (1) 冷链:数据交换是一次性数据传输,与剪贴板相同。
  (2) 温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。
  (3) 热链:当数据交换时服务器自动给客户发送数据。
  DDE交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE数据格式进行应用程序之间特别目的IPC,它们有更紧密耦合的通信要求。大多数基于Windows的应用程序都支持DDE。
2.8 对象连接与嵌入
   应用程序利用对象连接与嵌入(OLE)技术管理复合文档(由多种数据格式组成的文档),OLE提供使某应用程序更容易调用其它应用程序进行数据编辑的服 务。例如,OLE支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,该表格已在原 始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE,用户要显式地启动电子表格编辑器。
  同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术。
2.9 动态连接库
  Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。
  虽然可以通过DLL进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存的方法更好一些。
2.10 远程过程调用
  Win32 API提供的远程过程调用(RPC)使应用程序可以使用远程调用函数,这使在网络上用RPC进行进程通信就像函数调用那样简单。RPC既可以在单机不同进程间使用也可以在网络中使用。
   由于Win32 API提供的RPC服从OSF- DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过 Win32 API编写的RPC应用程序能与其它操作系统上支持DEC的RPC应用程序通信。使用RPC开发者可以建立高性能、紧密耦合的分布式应用程 序。
2.11 NetBios函数
  Win32 API提供NetBios函数用于处理低级网络控制,这主要是为IBM NetBios系统编写与Windows的接口。除非那些有特殊低级网络功能要求的应用程序,其它应用程序最好不要使用NetBios函数来进行进程间通信。
2.12 Sockets
   Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口为范例定义的一套Windows下的网 络编程接口。除了Berkeley Socket原有的库函数以外,还扩展了一组针对Windows的函数,使程序员可以充分利用Windows的消息机 制进行编程。
  现在通过Sockets实现进程通信的网络应用越来越多,这主要的原因是Sockets的跨平台性要比其它IPC机制好得多,另 外WinSock 2.0不仅支持TCP/IP协议,而且还支持其它协议(如IPX)。Sockets的唯一缺点是它支持的是底层通信操作,这使得在单机 的进程间进行简单数据传递不太方便,这时使用下面将介绍的WM_COPYDATA消息将更合适些。
2.13 WM_COPYDATA消息
   WM_COPYDATA是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数,参数是目 的窗口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息,这样收发双方就实现了 数据共享。
  WM_COPYDATA是一种非常简单的方法,它在底层实际上是通过文件映射来实现的。它的缺点是灵活性不高,并且它只能用于Windows平台的单机环境下。

分享到:
评论

相关推荐

    进程线程通信,线程同步,异步,进程通信经典进程间通信.7z

    常见的进程间通信方式包括管道(Pipe)、消息队列、共享内存、套接字(Socket)、命名管道、信号量等。例如,套接字通信广泛应用于分布式系统和网络编程,允许不同机器上的进程进行通信。 理解并熟练掌握这些概念和...

    Java NIO 应用使用内存映射文件实现进程间通信

    这一特性不仅提高了读写效率,而且还能用于进程间通信(IPC)。 内存映射文件的核心概念是将文件的内容直接映射到内存中,形成一个可以直接读写的缓冲区。在Windows系统中,内存映射文件可以是独立于物理文件的共享...

    C# 进程间通信:命名管道方式例子

    本文将深入探讨C#中使用命名管道进行进程间通信(IPC)的技术细节,并通过一个具体的实例来演示其实现。 命名管道是一种在操作系统内核中创建的特殊文件,允许不同进程之间通过读写操作进行通信。在Windows系统中,...

    《ORANGE’S:一个操作系统的实现》读书笔记(二十四)进程间通信(二)文章代码

    在操作系统设计中,进程间通信(IPC,Inter-Process Communication)是至关重要的组成部分,它允许不同进程之间交换数据和同步状态。《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现...

    易语言进程通信模块源码.7z

    本资源"易语言进程通信模块源码.7z"提供了一个用于进程间通信(IPC,Inter-Process Communication)的模块,这在多进程应用程序开发中是非常关键的部分。 进程通信是指在操作系统中运行的不同进程之间交换信息的一...

    《ORANGE’S:一个操作系统的实现》读书笔记(二十五)进程间通信(三)文章代码

    在操作系统设计中,进程间通信(IPC,Inter-Process Communication)是至关重要的组成部分,它允许不同进程之间交换数据和同步状态。《ORANGE’S:一个操作系统的实现》这本书深入浅出地介绍了操作系统的设计与实现...

    Android Aidl进程间通信,实现3个app共享一个服务

    在Android系统中,进程间通信(IPC,Inter-Process Communication)是实现不同应用程序之间数据交换的关键技术。AIDL(Android Interface Definition Language)是Android提供的一个工具,用于在不同进程间定义和...

    linux进程间的通信:匿名管道

    总的来说,Linux中的匿名管道是进程间通信的一个基础工具,虽然功能相对有限,但在特定场景下能有效实现进程间的简单数据交换。通过理解和运用这种技术,开发者可以更好地设计和实现多进程协作的系统和应用。

    C_Sharp与C_Plus_Plus两个进程间通过共享内存交互.7z

    在IT领域,进程间通信(IPC,Inter-Process Communication)是一种关键的技术,使得不同进程能够协同工作,交换数据。在Windows平台上,C#和C++是两种常用的编程语言,它们可以利用多种方式实现进程间通信,如管道、...

    易语言源码进程-2.7z

    通过学习这些源码,我们可以了解到如何在易语言中实现进程间的通信,如何监控和调整进程状态,以及如何处理并发和同步问题。 7z是一种高效的数据压缩格式,由7-Zip软件创建。它的压缩比高且支持多种压缩算法,常...

    易语言取相同程序不同的进程.7z

    5. **进程间通信**:如果需要不同进程间交换数据,可以使用消息队列、共享内存、管道或者套接字等方式进行进程间通信。 6. **错误处理**:编写过程中,应确保正确处理可能出现的错误,比如进程不存在、权限不足等,...

    unity程序和控制台程序通信.7z

    2. **C#命名管道**:这是一种轻量级的进程间通信方式,适合在同一台计算机上运行的进程间通信。在Unity中,可以使用`System.IO.Pipes`命名空间下的类来创建管道服务器和客户端,实现数据的发送和接收。 3. **网络套...

    易语言进程消息源码.7z

    进程间通信(IPC)是多进程系统中进程之间相互协作的重要方式,而消息传递是其中的一种常见机制。在Windows操作系统中,进程间的通信可以通过消息队列进行,发送进程将消息放入接收进程的消息队列,接收进程通过调用...

    易语言源码进程相关模块-3.7z

    4. 进程间通信:实现不同进程之间的数据交换,例如使用管道、消息队列或共享内存。 接下来,我们来谈谈7z格式。7z是一种高压缩比的文件压缩格式,由7-Zip软件开发,其压缩效率远超常见的ZIP和RAR格式。7z支持多种...

    SharedMemory.7z

    《VC与QT实现进程间通信详解》 在计算机科学领域,进程间通信(Inter-Process Communication, IPC)是操作系统提供的一种机制,使得不同进程之间能够交换数据和协调工作。在这个主题中,我们将深入探讨如何使用...

    易语言源码创建新进程.7z

    此外,正确处理进程的输入/输出、错误流以及进程间的通信也是创建新进程时需要考虑的问题。 在实际开发中,为了提高代码的可读性和复用性,我们可能会将创建进程的相关逻辑封装成一个子程序,这样在其他地方需要...

    易语言API修改进程占用内存源码.7z

    3. **进程间通信(IPC)**:修改其他进程的内存需要进程间通信的能力,可能需要用到OpenProcess, CloseHandle等API来获取或关闭进程句柄。 4. **内存寻址**:确定要修改的内存位置,需要知道进程的基地址以及目标...

    进程的创建.7z

    在实际应用中,你可能还需要考虑其他因素,如进程间通信(IPC)、资源管理、异常处理等。学习和理解进程的创建是深入理解操作系统和软件开发的关键步骤。"3.进程的创建"这个文件可能包含了更详细的示例代码或解释,...

    易语言源码进程相关模块-1.7z

    3. 进程通信:易语言提供了多种方式实现进程间的通信,如管道、共享内存、消息队列等,这些都是多线程或多进程编程中的重要手段。 4. 进程信息获取:获取进程ID、进程名、优先级、内存使用情况等,对于监控和调试...

    vc++修改其它进程的变量和调用其它进程函数.7z

    这通常涉及到Windows API中的进程间通信(IPC)技术,包括但不限于内存映射文件、管道、消息队列等。然而,最直接的方法是使用WinAPI的函数,如`OpenProcess`、`VirtualAllocEx`、`WriteProcessMemory`和`...

Global site tag (gtag.js) - Google Analytics