Git
英语 ▾ 主题 ▾ 最新版本 ▾ api-simple-ipc 最后更新于 2.43.0

Simple-IPC API 是一个包含 ipc_ 前缀库例程的集合,以及一个基本通信协议,该协议允许 IPC 客户端进程向 IPC 服务器进程发送特定于应用程序的 IPC 请求消息,并接收特定于应用程序的 IPC 响应消息。

通信通过 Windows 上的命名管道和其它平台上的 Unix 域套接字进行。IPC 客户端和 IPC 服务器在预先协商好的特定于应用程序的路径名(不在此设计范围之内)上进行会合,该路径名是本地于计算机系统的。

服务器应用程序进程中的 IPC 服务器例程创建一个线程池来监听连接并接收来自多个并发 IPC 客户端的请求消息。接收到这些消息后,它们会被分派到服务器应用程序回调以进行处理。IPC 服务器例程然后将响应逐段中继回 IPC 客户端。

客户端应用程序进程中的 IPC 客户端例程连接到 IPC 服务器,发送请求消息并等待响应。接收到响应后,该响应会返回给调用方。

例如,fsmonitor--daemon 功能将作为基于 IPC 服务器库例程的服务器应用程序构建。它将具有监视文件系统事件的线程和等待客户端连接的线程池。客户端(例如 git status)将请求自某个时间点以来的文件系统事件列表,服务器将以更改的文件和目录列表进行响应。请求和响应的格式是特定于应用程序的;IPC 客户端和 IPC 服务器例程将它们视为不透明的字节流。

与子进程模型的比较

Simple-IPC 机制不同于现有的 sub-process.c 模型(Documentation/technical/long-running-process-protocol.txt)以及像 Git-LFS 这样的应用程序使用的模型。在 LFS 风格的子进程模型中,助手由前台进程启动,通信通过一对绑定到子进程的 stdin/stdout 的文件描述符进行,子进程仅为当前前台进程提供服务,并且子进程在前台进程终止时退出。

在 Simple-IPC 模型中,服务器是一个非常长时间运行的服务。它可以同时为多个客户端提供服务,并且与每个活动客户端都有一个私有的套接字或命名管道连接。它可能由当前客户端进程(按需)启动,也可能由先前的客户端或系统启动时由操作系统启动。服务器进程不与终端关联,并且在客户端终止后仍然存在。客户端无法访问服务器进程的 stdin/stdout,因此必须通过套接字或命名管道进行通信。

服务器启动和关闭

基于 IPC 服务器的应用程序服务器是如何启动的,这也超出了 Simple-IPC 设计的范围,并且是使用它的应用程序的属性。例如,服务器可能在例行维护操作期间启动或重启,或者它可能作为系统启动序列期间的系统服务启动,或者它可能按需由需要时的前台 Git 命令启动。

类似地,服务器关闭是使用 simple-ipc 例程的应用程序的属性。例如,服务器可能决定在空闲时关闭,或者仅在明确请求时关闭。

Simple-IPC 协议

Simple-IPC 协议由来自客户端的单个请求消息和来自服务器的可选响应消息组成。客户端和服务器消息的长度都是无限的,并以一个刷新数据包结束。

pkt-line 例程 (gitprotocol-common[5]) 用于简化消息生成、传输和接收期间的缓冲区管理。刷新数据包用于标记消息的结尾。这允许发送方逐段生成和传输消息。它允许接收方逐段接收消息并知道何时已接收到整个消息。

客户端请求和服务器响应消息的实际字节格式是特定于应用程序的。IPC 层在不关心内部内容的情况下传输和接收它们作为不透明的字节缓冲区。调用应用程序层的任务是理解请求和响应消息的内容。

总结

从概念上讲,Simple-IPC 协议类似于 HTTP REST 请求。客户端连接、发出特定于应用程序的无状态请求、接收特定于应用程序的响应,然后断开连接。它是用于查询服务器的单次往返设施。Simple-IPC 例程隐藏了套接字、命名管道和线程池细节,并允许应用程序层专注于手头的任务。

scroll-to-top