[066] JUCE Diary #11: Inter-process Communication
IPC (Inter-process Communication) 指的是兩支程式透過某種方式進行單向或雙向資料傳輸。不同平台有不同的資料傳輸技術,Windows 上使用的是 Named Pipe ,Mac & Linux 則使用 socket。
土法鍊鋼打造 IPC 需要寫不少程式碼,因此,許多有規模的專案都會將其包裝成函式庫,把大量苦工碼藏起來,開放出簡單易用的介面給客人用。有心觀察其內部設計,除 JUCE 外,Chromium 也是不錯的選項。
JUCE 除了有 InterprocessConnection class 把各平台的資料傳輸技術包裝成通用的介面,更進一步把常用的功能包裝成兩個簡單易用的 class:
其流程為:
- 透過
ChildProcessMaster::launchSlaveProcess()
執行指定的執行檔 - Child (Slave) process 一執行必須先(最好是在
initialise
內)initialiseFromCommandLine()
與 Master 建立連線。(舊文漏了 initialiseFromCommandLine(),感謝網友指正)
Master 使用 sendMessageToSlave
傳送資料給 Slave,此時 handleMessageFromMaster
method 會被呼叫。由於是非同步操作,若 Slave 需要回傳給 Master,必須使用 sendMessageToMaster
method。
需要特別留意的是 sendMessageToSlave
及 sendMessageToMaster
的回傳值皆為 bool,其代表的意義是該訊息有無正確「傳送」出去,成功「傳送」出去的訊息不一定會成功被 ChildProcessSlave
接收。
撰寫 IPC 類的程式碼常需要知道雙方是否連線成功,何時連線何時斷線,這點 ChildProcessSlave
提供的以下 method:
- handleConnectionMade
- handleConnectionLost
ChildProcessMaster
也提供了 handleConnectionLost method 用以偵測是否與 Slave 斷開連結。