作者EdisonX (卡卡兽)
看板C_and_CPP
标题Re: [问题] 如何读取外部传进来的参数?
时间Thu Aug 11 00:37:29 2016
※ 引述《gn00618777 (非常念旧)》之铭言:
: 我知道在 main(int argc, char*argv){
: }
: 可以传外部参数进去例如 xxx.exe "参数"
: 但如果我在 main 里面有一个无穷回圈 while
: while 里面我该如何获得外面传进来的参数呢??(假设这个无穷回圈不能read file)
: 短时间内想不出来="=
: 谢谢指教
1F:推 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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1470847058.A.1B3.html
2F:推 wtchen: 推阿,感谢EdisonX大~~~~ 08/11 01:48
3F:→ wtchen: Real-time system 比较常用Semaphore的样子 08/11 01:52
4F:→ EdisonX: 只能说还没机会接触 Real-time system. 08/11 01:54
5F:推 wtchen: Message queue也有 08/11 02:43
6F:→ EdisonX: 范例用很多 message queue , SendMessage / PostMessage 08/11 02:48
7F:→ EdisonX: 只是要传大量资料的时候 Message Queue 可能不够用 08/11 02:48
8F:推 damody: 感谢范例 08/11 08:18
9F:推 drumstick: 感谢范例 08/11 09:31
10F:推 Yshuan: 这篇很实用 08/11 11:51
11F:推 popen: 查我我也无法教你 08/12 10:02
12F:→ TobyH4cker: 只好插你了 08/12 10:50
13F:→ hichcock: 好奇, pipe 比 memory map 慢!? 没实测过, 跟想像的不同 08/12 15:32
14F:→ hichcock: 一直以为 pipe 是最快的了 08/12 15:33
15F:→ Schottky: memory map 永远是最快的,正确使用的话 08/12 16:13
16F:→ EdisonX: 奇怪,是我都用 popen / fread / pclose 的关系吗 ? 我觉 08/13 00:17
17F:→ EdisonX: 得 pipe 很慢,特别是在linux时,要去启动另一个process. 08/13 00:18
18F:推 VictorTom: 推:) 08/13 14:30
19F:推 wtchen: 请问一下,超大bmp的size大约多少?想试着玩看看 08/15 01:37
20F:推 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