日本語 ▾ トピック ▾ 最新バージョン ▾ 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スタイルのサブプロセスモデルでは、ヘルパーはフォアグラウンドプロセスによって開始され、サブプロセスの標準入力/標準出力にバインドされた一対のファイル記述子を介して通信が行われ、サブプロセスは現在のフォアグラウンドプロセスのみにサービスを提供し、フォアグラウンドプロセスが終了するとサブプロセスも終了します。

Simple-IPCモデルでは、サーバーは非常に長期間実行されるサービスです。同時に多くのクライアントにサービスを提供でき、アクティブな各クライアントにはプライベートソケットまたは名前付きパイプ接続があります。現在のクライアントプロセスによって(オンデマンドで)開始されることもあれば、以前のクライアントやOSの起動時に開始されることもあります。サーバープロセスは端末に関連付けられておらず、クライアントが終了した後も存続します。クライアントはサーバープロセスの標準入力/標準出力にアクセスできないため、ソケットまたは名前付きパイプを介して通信する必要があります。

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

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