開發平台(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
看到了無法理解的結果
輸出: