日本語 ▾ トピック ▾ 最新バージョン ▾ api-simple-ipc は 2.49.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.adoc)や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])は、メッセージの生成、送信、受信時のバッファ管理を簡素化するために使用されます。フラッシュパケットはメッセージの終わりを示すために使用されます。これにより、送信者はメッセージを段階的に生成および送信できます。受信者はメッセージをチャンクで段階的に受信し、メッセージ全体を受信した時期を知ることができます。

クライアントリクエストとサーバーレスポンスメッセージの実際のバイト形式はアプリケーション固有です。IPCレイヤーは、内容を気にすることなく、それらを不透明なバイトバッファとして送受信します。リクエストおよびレスポンスメッセージの内容を理解することは、呼び出し元アプリケーションレイヤーの役割です。

概要

概念的に、Simple-IPCプロトコルはHTTP RESTリクエストに似ています。クライアントは接続し、アプリケーション固有のステートレスなリクエストを行い、アプリケーション固有のレスポンスを受け取り、切断します。これはサーバーにクエリを行うための1ラウンドトリップの機能です。Simple-IPCルーチンは、ソケット、名前付きパイプ、およびスレッドプールの詳細を隠蔽し、アプリケーション層が現在のタスクに集中できるようにします。

scroll-to-top