开发平台(Platform): (Ex: Win10, Linux, ...)
Ubuntu 18.04 LTS
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
gcc
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
https://ideone.com/jugcYC
重新上传完整原始码
补充说明(Supplement):
程式码如以上连结
想请教版上各位先进 我的程式码这一段是否出了什么问题
这段code作用是这样的
1. 我要写一个自己用的CreateProcess() 在linux底下去call process起来做事
2. 中间是fork...exec 因为前面印出来就发现有问题了
我觉得应该是跟fork以后开始没关系
3. 传进来的参数
p_sAppName: process name
p_sCmdArg: parameter, 以空白切割, 所以我会去呼叫一个自己写的ParserCmd()
去把传进来的参数去parser成一个vector<string> 把所有参数放里面
ParserCmd()的结果我确定是对的所以忽略不贴
p_sEnvArg: 环境变量的参数, 作法如同上面的p_sCmdArg
p_nRetVal: 在fork()...exec()这段拿来回传呼叫process的成功或失败
假设我今天call这个function的呼叫方式是这样
MyCreateProcess("ffmpeg", "-vsync 0 -i file.cfg Compare.yuv");
p_sEnvArg/p_nRetVal有默认值NULL
我预计进入function后
1. 传进来的p_sCmdArg, 会被ParserCmd()拆解然后存每一个cmd在vector里面
2. 由于execve需要传参数/环境变量型态为char**, 所以我先
char **ppCmdArg = new char*[vCmdSet.size() + 1];
然后在循环中, 针对于每一个ppCmdArg[i], 我再
ppCmdArg[i] = new char[vCmdSet[i].length() + 1];
由于参数不可能每个长度都相同 因此new出来的结果长度都不相同
3. 接下来我再把vector里面储存的参数字串拷贝到new出来的char* ppCmdArg[i]
4. 如果有传环境变量我也是做一样的处理 这次范例没有可以无视
5. 接着就把ppCmdArg给execve当参数呼叫process
结果我发现程式在结束的地方 我做delete[] array出了问题
然后我把这段程式码加了printf做debug
看到了无法理解的结果
输出: