[概念] 兩個程序以 IPC 方式建立一個能互相通訊的共享空間

        在同一Windows系統內的兩個程序要互傳資料,可以用建立內部 TCP 連線方式傳送,不過這種方式不適合大量資料的存取。還有一種方式稱為 IPC (Inter Process Communication),兩個程序之間建立一個共享的空間,透過這塊空間互傳資料互相通訊,參考[1],我們可以把這塊空間看成是一個虛擬檔案,類似開啟檔案的步驟來讀寫它。

        首先,雙方有一方要建立共享空間,另一方則是開啟共享空間,如下圖一所示。建立的這方要對這塊空間命名,如果沒有命名,另一方就無法開啟正確的空間。如果我們建立一個很大的空間時,要先讀取目前系統的 available page file 還剩多少,如果不足,那就要加大系統的記憶體容量,參考[2]。當雙方能成功取得這塊共享空間的控制權後,這樣才能利用 MapViewOfFile 函數獲得位址,要留意的一點是位址的 alignment,這塊空間並不是想要指定 到某一位址就能任一指定,它有限制位址必須對齊系統的 AllocationGranularity,所以在規劃空間內部的資料結構時就要先設計安排妥當。

        接著,因為存取資料是一個共享空間,所以我們要設計一個互斥鎖保護資料,避免雙方同時存取同一位址而產生資料錯亂,如下圖所示,同樣地建立的互斥鎖也要命名。最後,建立一個事件通知也是需要的,總不能雙方都要輪詢方式來查看資料有沒有更新吧? 當一方寫完資料後,發個事件通知告訴對方,再由對方來讀取,這樣效率會比較好。
圖一:IPC 操作所調用的相關API

參考資料
[1] Interprocess Communication Between 32-bit and 64-bit Applications
[2] Creating Named Shared Memory

留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[筆記] Visual Studio 遠端偵錯的設定步驟

[筆記] Android APP BLE範例程式 -- BluetoothLeGatt

[模組] LD3320 離線語音辨識晶片與 ESP32 無線傳輸