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 モデルでは、サーバーは非常に長時間実行されるサービスです。同時に多くのクライアントにサービスを提供でき、アクティブな各クライアントへのプライベートソケットまたは名前付きパイプ接続があります。現在のクライアントプロセスによって(オンデマンドで)開始されるか、以前のクライアントまたは起動時に OS によって開始されている可能性があります。サーバープロセスは端末に関連付けられておらず、クライアントが終了した後も存続します。クライアントはサーバープロセスの stdin/stdout にアクセスできないため、ソケットまたは名前付きパイプを介して通信する必要があります。

サーバーの起動とシャットダウン

IPC サーバーに基づくアプリケーションサーバーの起動方法は、Simple-IPC 設計の範囲外でもあり、それを使用するアプリケーションのプロパティです。たとえば、サーバーはルーチンのメンテナンス操作中に開始または再起動されるか、システムの起動シーケンス中にシステムサービスとして開始されるか、必要に応じてフォアグラウンド Git コマンドによってオンデマンドで開始される場合があります。

同様に、サーバーのシャットダウンは、simple-ipc ルーチンを使用するアプリケーションのプロパティです。たとえば、サーバーはアイドル時または明示的な要求があった場合にのみシャットダウンすることを決定する場合があります。

Simple-IPC プロトコル

Simple-IPC プロトコルは、クライアントからの単一の要求メッセージと、サーバーからのオプションの応答メッセージで構成されています。クライアントメッセージとサーバーメッセージはどちらも長さが無制限で、フラッシュパケットで終了します。

pkt-line ルーチン(gitprotocol-common[5])は、メッセージの生成、送信、および受信中のバッファ管理を簡素化するために使用されます。フラッシュパケットは、メッセージの終わりをマークするために使用されます。これにより、送信者はメッセージを増分的に生成および送信できます。受信者は、メッセージをチャンクで増分的に受信し、メッセージ全体を受信した Zeitpunkt を知ることができます。

クライアント要求およびサーバー応答メッセージの実際のバイト形式は、アプリケーション固有です。 IPC レイヤーは、内部のコンテンツを気にせずに、それらを不透明なバイトバッファとして送受信します。要求と応答メッセージの内容を理解するのは、呼び出し元のアプリケーションレイヤーの仕事です。

まとめ

概念的には、Simple-IPC プロトコルは HTTP REST 要求に似ています。クライアントは接続し、アプリケーション固有のステートレス要求を行い、アプリケーション固有の応答を受信し、切断します。サーバーを照会するための 1 回限りの往復機能です。 Simple-IPC ルーチンは、ソケット、名前付きパイプ、およびスレッドプールの詳細を隠し、アプリケーションレイヤーが目の前のタスクに集中できるようにします。

scroll-to-top