推 wtchen: 東西出來後可以上來分享嗎?我對這很有興趣08/10 20:07
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 可愛分隔線 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
剛好我對 IPC (inter process communication) 是初學,一起討論一下,
講錯的話請鞭小力點,謝謝。
首先要講,只要能達到二個 Process 相互通訊 (也可以一邊丟一邊收),
都叫 IPC,達成 IPC 這個目的的手法就多了,
https://en.wikipedia.org/wiki/Inter-process_communication
裡面列舉約 10 種方法,但注意這些 IPC 方法可能衍生幾個問題
(1) 實作難易度 (好啦, 這可能不是問題)
(2) 效率問題 (如要傳送大量的訊息、檔案時,還要考慮收到的資料時效性)
(3) 重覆收到相同訊息 (可能 server 發一次通知,client 收到二次通知)
最終當然是評估問題本質,再決定挑用哪個方法。
目前我只有在 Windows 底下實作過 IPC,
所以交流的可能有限。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 可愛分隔線 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
http://pan.baidu.com/s/1geITiYR IPC_V1.00.15.7z ,
(由於為私人使用空間,恕週末關閉,若覺得不錯的話我不介意板友用推文轉空間)
解壓後發現裡面超亂,主要包含下述東西
(1) 8 種 IPC 方法實作,包含 Client 端與 Server 端,也包含 X86 / X64 編譯。
(2) Executable 資料夾為所有生成之執行檔,./Executable/Result.xlsx
為八種方法之心得備註,以及簡易之計時整理,計時為以傳送一張超大之 bmp
圖檔 (恕我忘了那張圖跑哪去了 @@)
(3) SimpleDemoCode 資料夾為每個方法的重點程式碼整理
開發環境 Win 7 , IDE VS2010 , 程式語言 MFC
只是測試用,所以有很多東西很魔術。
8 種方法之細節還是看 Code 較佳,這裡不贅述,只講結論
(1) 最笨的方法是用外部檔案溝通,以檔案之生成、刪除、內容做為二個 Process
交握的手法。
(2) 測試最快的方法是 MemoryFile。
(3) 效能還可以接受、最容易撰寫的是 WM_DATACOPY。
(4) MailSolt 好處是可以當廣播系統使用,但要處理接收端會收到多次訊息。
(5) socket 其實我沒寫好,只是寫 sample,所以效能不算有跑出來,
另走 socket 要注意,一次傳送的 buffer 不能太大,不然會掛。
socket 大概是最常被推的方法,還能跨 OS 做 IPC。
(6) Pipe 也是常被推的方案,然後如果只是要簡單的話,
可以查一下 popen , pclose ( 不具名 pipe ).
注意是第 8 種方法很危險 ,
用的是 ReadProcessMemory / WriteProcessMemory (遊戲修改大師在用的東西),
也有人說這種方法不算 IPC,所以我沒納在效能排名裡面 (雖然它應是最快的)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 可愛分隔線 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以上,若敘述有誤請指正,歡迎補充,謝謝。
--
If there is no tomorrow,
I want to see u last time.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.138.11
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1470847058.A.1B3.html
推 wtchen: 推阿,感謝EdisonX大~~~~ 08/11 01:48
→ wtchen: Real-time system 比較常用Semaphore的樣子 08/11 01:52
→ EdisonX: 只能說還沒機會接觸 Real-time system. 08/11 01:54
推 wtchen: Message queue也有 08/11 02:43
→ EdisonX: 範例用很多 message queue , SendMessage / PostMessage 08/11 02:48
→ EdisonX: 只是要傳大量資料的時候 Message Queue 可能不夠用 08/11 02:48
推 damody: 感謝範例 08/11 08:18
推 drumstick: 感謝範例 08/11 09:31
推 Yshuan: 這篇很實用 08/11 11:51
推 popen: 查我我也無法教你 08/12 10:02
→ TobyH4cker: 只好插你了 08/12 10:50
→ hichcock: 好奇, pipe 比 memory map 慢!? 沒實測過, 跟想像的不同 08/12 15:32
→ hichcock: 一直以為 pipe 是最快的了 08/12 15:33
→ Schottky: memory map 永遠是最快的,正確使用的話 08/12 16:13
→ EdisonX: 奇怪,是我都用 popen / fread / pclose 的關係嗎 ? 我覺 08/13 00:17
→ EdisonX: 得 pipe 很慢,特別是在linux時,要去啟動另一個process. 08/13 00:18
推 VictorTom: 推:) 08/13 14:30
推 wtchen: 請問一下,超大bmp的size大約多少?想試著玩看看 08/15 01:37
推 wtchen: 還有Shared memory不是要搭配Semaphore等同步機制? 08/15 02:46
→ wtchen: 對我來說Semaphore是Shared memory安全機制不算兩種東西 08/15 02:46
所有 IPC 都要有同步沒錯,不過同步機制一直都是另一個可以討論的範圍,
所以我的 sample code 也沒放進去。
---------------------------------------------------------------------------
剛再下載重看一下 Code,發現 Windows Defect 竟然會把裡面的東西判病毒。
bmp 圖檔我預設是放在 C:\Users\EdisonX\Desktop\IPC\demobmp\P2_8294x5529.bmp
( UI 可選路徑和圖檔 ),所以大小約 8294 x 5529 x 3 + 54 (再聲明,這是粗算),
算下來約 131 MB,操作方式和介面可能有點亂,
以 DATACOPY_IPCClient / DATACOPY_IPCServer 做為簡易說明。
----------------------------------------------------------------------------
比較莫名的操作大概是 Client 端,有幾個 Button 。
(1) Set Buf 0 --> 將準備要收的 Buffer 清零,並計時。
(2) Write Buf 0 --> 將 Buffer 寫入 C:\\IPCClient.bmp 裡,並計時。
(3) 將接收到的 Buffer , 存到另一個 Buffer 裡去,並計時。
( 是的,沒錯,這裡要做 Deep Copy 的動作,原因是 DATACOPY
拿到的資料有時效限制,在某個時間點後該 Pointer 將失效,
故做 Deep Copy , 至於是否真的必要 Deep Copy , 看應用。 )
(4) Write Cpy Buf --> 將剛做完 Deep Copy 的副本,
存到 C:\\IPCClient.bmp,並計時。
(5) Clear Msg --> 清除訊息提示。
注意,若自己電腦 C 槽需要讀寫權限,請直接在 Code 裡面改成其他路徑,
這份 Copy 沒處理系統管理者權限問題。
(1) 開啟 DATACOPY_IPCServer 專案,先 Build + Execute。
(2) 選擇 filename , 保險起見請選 bmp 24 bpp , 當時我的環境是測這東西。
(3) 開啟 DATACOPY_IPCClient 專案,Build + Execute
(4) 按下 DATACOPY_IPCServer 裡面的 COPYDATA Button,
這時 Client 會收到整個圖檔,但只存在於 memory。
(5) 到 DATACOPY_IPCClient ,按下 Write Cpy Buf 後,會寫入檔案並開圖,
用圖驗證資料傳送是否正確。
(6) 在這裡例子裡,按下 DATACPY_IPCClient 裡的 Write Buf, 一樣寫檔開圖,
發現圖開不起來,主因是 Buffer 失效。
其他的執行檔操作也是大同小異,剩下的就 trace 、小修改、看結果吧。
※ 編輯: EdisonX (180.177.73.92), 08/15/2016 04:12:08