Re: [問題] 如何讀取外部傳進來的參數?
※ 引述《gn00618777 (非常念舊)》之銘言:
: 我知道在 main(int argc, char*argv){
: }
: 可以傳外部參數進去例如 xxx.exe "參數"
: 但如果我在 main 裡面有一個無窮迴圈 while
: while 裡面我該如何獲得外面傳進來的參數呢??(假設這個無窮迴圈不能read file)
: 短時間內想不出來="=
: 謝謝指教
推
08/10 20:07,
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
推
08/11 01:48, , 1F
08/11 01:48, 1F
→
08/11 01:52, , 2F
08/11 01:52, 2F
→
08/11 01:54, , 3F
08/11 01:54, 3F
推
08/11 02:43, , 4F
08/11 02:43, 4F
→
08/11 02:48, , 5F
08/11 02:48, 5F
→
08/11 02:48, , 6F
08/11 02:48, 6F
推
08/11 08:18, , 7F
08/11 08:18, 7F
推
08/11 09:31, , 8F
08/11 09:31, 8F
推
08/11 11:51, , 9F
08/11 11:51, 9F
推
08/12 10:02, , 10F
08/12 10:02, 10F
→
08/12 10:50, , 11F
08/12 10:50, 11F
→
08/12 15:32, , 12F
08/12 15:32, 12F
→
08/12 15:33, , 13F
08/12 15:33, 13F
→
08/12 16:13, , 14F
08/12 16:13, 14F
→
08/13 00:17, , 15F
08/13 00:17, 15F
→
08/13 00:18, , 16F
08/13 00:18, 16F
推
08/13 14:30, , 17F
08/13 14:30, 17F
推
08/15 01:37, , 18F
08/15 01:37, 18F
推
08/15 02:46, , 19F
08/15 02:46, 19F
→ 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
討論串 (同標題文章)