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