[066] JUCE Diary #11: Inter-process Communication

[066] JUCE Diary #11: Inter-process Communication

IPC (Inter-process Communication) 指的是兩支程式透過某種方式進行單向或雙向資料傳輸。不同平台有不同的資料傳輸技術,Windows 上使用的是 Named Pipe ,Mac & Linux 則使用 socket。

土法鍊鋼打造 IPC 需要寫不少程式碼,因此,許多有規模的專案都會將其包裝成函式庫,把大量苦工碼藏起來,開放出簡單易用的介面給客人用。有心觀察其內部設計,除 JUCE 外,Chromium 也是不錯的選項。

JUCE 除了有 InterprocessConnection class 把各平台的資料傳輸技術包裝成通用的介面,更進一步把常用的功能包裝成兩個簡單易用的 class:

其流程為:

  1. 透過 ChildProcessMaster::launchSlaveProcess() 執行指定的執行檔
  2. Child (Slave) process 一執行必須先(最好是在 initialise 內)initialiseFromCommandLine()與 Master 建立連線。(舊文漏了 initialiseFromCommandLine(),感謝網友指正)

Master 使用 sendMessageToSlave 傳送資料給 Slave,此時 handleMessageFromMaster method 會被呼叫。由於是非同步操作,若 Slave 需要回傳給 Master,必須使用 sendMessageToMaster method。

需要特別留意的是 sendMessageToSlavesendMessageToMaster 的回傳值皆為 bool,其代表的意義是該訊息有無正確「傳送」出去,成功「傳送」出去的訊息不一定會成功被 ChildProcessSlave 接收。

撰寫 IPC 類的程式碼常需要知道雙方是否連線成功,何時連線何時斷線,這點 ChildProcessSlave 提供的以下 method:

  • handleConnectionMade
  • handleConnectionLost

ChildProcessMaster 也提供了 handleConnectionLost method 用以偵測是否與 Slave 斷開連結。