进程间通信
Windows 操作系统提供用于促进应用程序之间的通信和数据共享的机制。 这些机制启用的活动统称为进程间通信 (IPC)。 某些形式的 IPC 有助于在多个专门进程之间分工。 其他形式的 IPC 有助于在网络上的计算机之间分工。
通常,应用程序可以使用归类为客户端或服务器的 IPC。 客户端是请求来自其他应用程序或进程的服务的应用程序或进程。 服务器是响应客户端请求的应用程序或进程。 许多应用程序根据具体情况既充当客户端又充当服务器。 例如,字处理应用程序可能会充当客户端,从充当服务器的电子表格应用程序请求制造成本摘要表。 反过来,电子表格应用程序可能会充当客户端,从自动化库存控制应用程序请求最新的库存级别。
在确定应用程序将受益于 IPC 后,必须确定要使用的可用 IPC 方法。 应用程序可能会使用多个 IPC 机制。 这些问题的解答决定了应用程序是否可以通过使用一个或多个 IPC 机制受益。
- 应用程序是否应该能够与网络中其他计算机上运行的其他应用程序通信,或者应用程序是否只与本地计算机上的应用程序通信就可以了?
- 应用程序是否应该能够与可能在运行其他操作系统(如 16 位 Windows 或 UNIX)的其他计算机上运行的应用程序通信?
- 应用程序的用户是否必须选择与应用程序通信的其他应用程序,或者应用程序是否能够隐式查找其协作合作伙伴?
- 应用程序是否应该以一般方式与许多其他应用程序通信,例如允许用任何其他应用程序进行剪切和粘贴操作,或者其通信要求是否应该局限于与特定其他应用程序的一组受限交互?
- 性能是否是应用程序的关键方面? 所有 IPC 机制都包含一定的开销。
- 应用程序应该是 GUI 应用程序还是控制台应用程序? 某些 IPC 机制需要 GUI 应用程序。
Windows 支持以下 IPC 机制:
使用剪贴板进行 IPC
剪贴板充当用于在应用程序之间共享数据的中央仓库。 当用户在应用程序中执行剪切或复制操作时,应用程序会将所选数据以一种或多种标准格式或应用程序定义的格式放在剪贴板上。 然后,任何其他应用程序都可以从剪贴板中检索数据,并从它理解的可用格式中进行选择。 剪贴板是一种极为松散耦合的交换介质,应用程序只需就数据格式达成一致。 应用程序可以驻留在同一台计算机上,也可以驻留在网络中的其他计算机上。
要点:所有应用程序都应该支持剪贴板,以使用它们理解的数据格式。 例如,文本编辑器或字处理器至少应该能够以纯文本格式生成和接受剪贴板数据。 有关详细信息,请参阅剪贴板。
使用 COM 进行 IPC
使用 OLE 管理复合文档的应用程序,即由来自各种不同应用程序的数据组成的文档。 OLE 将提供服务,使应用程序能够在其他应用程序上轻松调用以进行数据编辑。 例如,使用 OLE 的字处理器可从电子表格中嵌入图形。 用户可以通过选择嵌入的图表进行编辑,从而从字处理器中自动启动电子表格。 OLE 负责启动电子表格并呈现要编辑的图形。 当用户退出电子表格时,将在原始字处理器文档中更新图形。 电子表格似乎是字处理器的扩展。
OLE 的基础是组件对象模型 (COM)。 使用 COM 的软件组件可以与其他各种组件通信,甚至是尚未编写的组件。 组件将作为对象和客户端进行交互。 分布式 COM 将扩展 COM 编程模型,使其能够在网络中工作。
要点:OLE 支持复合文档,并使应用程序能够包含嵌入或链接的数据,选择这些数据后,会自动启动另一个应用程序以进行数据编辑。 这使应用程序能够由使用 OLE 的任何其他应用程序进行扩展。 COM 对象通过一组或多组相关函数(称为接口)提供对对象数据的访问权限。 有关详细信息,请参阅 COM 和 ActiveX 对象服务。
使用数据复制进行 IPC
数据复制使应用程序能够使用 WM_COPYDATA 消息将信息发送给另一个应用程序。 此方法需要发送应用程序与接收应用程序进行协作。 接收应用程序必须知道信息格式,并且能够识别发送方。 发送应用程序无法修改任何指针引用的内存。
要点:数据复制可用于使用 Windows 消息传送功能将信息快速发送给另一个应用程序。 有关详细信息,请参阅数据复制。
使用 DDE 进行 IPC
DDE 是一种使应用程序能够以各种格式交换数据的协议。 应用程序可以使用 DDE 进行一次性数据交换或持续交换,交换过程中,应用程序会在新数据可用时相互更新。
DDE 使用的数据格式与剪贴板使用的数据格式相同。 可将 DDE 视为剪贴板机制的扩展。 剪贴板几乎总是用于对用户命令进行一次性响应,例如从菜单中选择“粘贴”命令。 DDE 通常也由用户命令启动,但它通常可继续正常运行,而无需进一步的用户交互。 你还可以为通信要求更紧密耦合的应用程序之间的特殊用途 IPC 定义自定义 DDE 数据格式。
DDE 交换可能会在同一台计算机上或网络中不同计算机上运行的应用程序之间发生。
要点:DDE 不如新技术那么高效。 但是,如果其他 IPC 机制不合适,或者必须与仅支持 DDE 的现有应用程序进行连接,则你仍然可以使用 DDE。 有关详细信息,请参阅动态数据交换和动态数据交换管理库。
使用文件映射进行 IPC
文件映射使进程能够将文件内容视为进程地址空间中的内存块。 此进程可以使用简单的指针操作来检查和修改文件内容。 当两个或更多个进程访问同一文件映射时,每个进程都会收到指向其自己的地址空间中内存的指针,该指针可用于读取或修改文件的内容。 进程必须使用同步对象(如信号灯)来防止多任务环境中发生数据损坏。
你可以使用特殊情况的文件映射在进程之间提供命名的共享内存。 如果在创建文件映射对象时指定系统交换文件,则文件映射对象会被视为共享的内存块。 其他进程可以通过打开同一文件映射对象来访问相同内存块。
文件映射非常高效,还提供操作系统支持的安全属性,这些属性有助于防止未经授权的数据损坏。 文件映射只能在本地计算机上的进程之间使用;不能通过网络使用文件映射。
要点:文件映射是同一台计算机上两个或更多个进程共享数据的高效方法,但你必须在进程之间提供同步。 有关详细信息,请参阅文件映射和同步。
使用 Mailslot 进行 IPC
Mailslot 可提供单向通信。 任何创建 mailslot 的进程都是 mailslot 服务器。 其他进程(称为 mailslot 客户端)通过将邮件写入其 mailslot 来将邮件发送到 mailslot 服务器。 传入邮件将始终追加到 mailslot。 mailslot 将保存邮件,直到 mailslot 服务器读取邮件为止。 进程可以是 mailslot 服务器和 mailslot 客户端,因此可以使用多个 mailslot 进行双向通信。
mailslot 客户端可以将邮件发送到其本地计算机上的 mailslot、另一台计算机上的 mailslot 或指定网络域中所有计算机上同名的所有 mailslot。 广播到域上所有 mailslot 的邮件不能超过 400 字节,而发送到单个 mailslot 的邮件不能超过 mailslot 服务器在创建 mailslot 时指定的最大邮件大小。
要点:Mailslot 为应用程序提供了一种简单的方法来发送和接收短消息。 它们还提供跨网络域中所有计算机广播消息的功能。 有关详细信息,请参阅 Mailslot。
使用管道进行 IPC
双向通信有以下两种类型的管道:匿名管道和命名管道。 匿名管道使相关进程能够相互传输信息。 通常,匿名管道用于重定向子进程的标准输入或输出,以便它能够与其父进程交换数据。 若要在两个方向交换数据(双工操作),你必须创建两个匿名管道。 父进程使用写入句柄将数据写入一个管道,而子进程使用其读取句柄从该管道中读取数据。 同样,子进程会将数据写入另一个管道,父进程从中读取数据。 匿名管道不能通过网络使用,也不能在不相关的进程之间使用。
命名管道用于在不是相关进程的进程之间以及不同计算机上的进程之间传输数据。 通常,命名管道服务器进程会创建一个具有已知名称或要告知其客户端的名称的命名管道。 知道管道名称的命名管道客户端进程可以打开其另一端,但会受命名管道服务器进程指定的访问限制的约束。 服务器和客户端都连接到管道后,它们可以通过对管道执行读取和写入操作来交换数据。
要点:匿名管道提供了一种将标准输入或输出重定向到同一计算机上的子进程的有效方法。 无论数据是驻留在同一台计算机上还是驻留在网络上,命名管道都会提供一个用于在两个进程之间传输数据的简单编程接口。 有关详细信息,请参阅管道。
使用 RPC 进行 IPC
RPC 使应用程序能够远程调用函数。 因此,RPC 使 IPC 与调用函数一样简单。 RPC 在单个计算机或网络中的不同计算机上的进程之间运行。
Windows 提供的 RPC 符合开放软件基金会 (OSF) 分布式计算环境 (DCE) 的要求。 这意味着使用 RPC 的应用程序能够与通过其他支持 DCE 的操作系统运行的应用程序通信。 RPC 自动支持数据转换,以考虑不同的硬件体系结构以及不同环境之间的字节排序。
RPC 客户端和服务器紧密耦合,但仍能保持高性能。 该系统广泛使用 RPC 来促进操作系统的不同部分之间的客户端/服务器关系。
要点:RPC 是一个函数级接口,支持自动数据转换以及与其他操作系统通信。 使用 RPC,你可以创建紧密耦合的高性能分布式应用程序。 有关详细信息,请参阅 Microsoft RPC 组件。
使用 Windows 套接字进行 IPC
Windows 套接字是与协议无关的接口。 它利用基础协议的通信功能。 在 Windows 套接字 2 中,套接字句柄可以有选择性地用作标准文件 I/O 函数的文件句柄。
Windows 套接字基于伯克利软件分发 (BSD) 首次推广的套接字。 使用 Windows 套接字的应用程序可以在其他类型的系统上与其他套接字实现通信。 但是,并非所有传输服务提供商都支持所有可用的选项。
要点:Windows 套接字是一个与协议无关的接口,能够支持当前和新兴的网络功能。 有关详细信息,请参阅 Windows 套接字 2。
Windows 中的 unix 套接字 (AF_UNIX) 函数
从 Windows 预览体验成员内部版本 17063 开始,你可以使用 Windows 上的 unix 套接字 (AF_UNIX) 地址系列在 Win32 进程之间进行通信。 Unix 套接字允许在同一计算机上的进程之间进行进程间通信 (IPC)。 有关详细信息,请参阅 AF_UNIX 进入到 Windows 中 博客文章。
弃用远程 Mailslot 协议
从 Windows 11 Insider Preview 内部版本 25314 和 Windows Server 预览版 25314 开始,我们默认开始禁用远程 Mailslot 协议。 这是弃用并最终从 Windows 中删除的前兆。 有关详细信息,请参阅 作为 Windows 预览体验计划的一部分开始结束 Mailslot 博客文章。