看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《gn00618777 (非常念舊)》之銘言: : 我知道在 main(int argc, char*argv){ : } : 可以傳外部參數進去例如 xxx.exe "參數" : 但如果我在 main 裡面有一個無窮迴圈 while : while 裡面我該如何獲得外面傳進來的參數呢??(假設這個無窮迴圈不能read file) : 短時間內想不出來="= : 謝謝指教
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