作者achicn3 (Sher)
看板C_and_CPP
標題[問題] execvp
時間Fri Sep 21 18:44:48 2018
開發平台(Platform): (Ex: Win10, Linux, ...)
Ubuntu
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
No
問題(Question):
這程式是要模擬一個linux shell
前面讓使用者輸入字串之後再進行字串切割
並在最後放置\0
例如輸入 ls 會存進 char **arg內
此時
*arg[0] = ls //count = 2 now
然後在 *argv[1]這個位置 放置 '\0'
---- (ubnutu 18.04,gcc version:7.4.0)
-> *newArgv[count-1]='\0';//程式碼57行處
----
之後再將這個arg 傳遞到另一個function : void run(char** argv)內
執行execvp(argv[0],argv);
但就會出現 ls: cannot access '': No such file or directory
1.問題是為什麼 execvp 會讀取到這個 null?
我知道\0在字串中就是 null 所以可能會被當作參數去讀取
可是又會需要到這個\0 去計算現在argv中有幾個token
while(*argv[i]!='\0'){ //這個while迴圈在另一個function內->free_arg(char **argv
)
++i;
}
該怎麼解決execvp這個問題
2.如果我將上面改成
---- (ubnutu 16.04,gcc version:5.4.0)
-> newArgv[count-1]='\0';//程式碼57行處
----
在ubnutu 16.04下可以正常運作指令 不會出現任何錯誤
但是如果在18.04下 上面這行程式碼就會出現segmenation fault
這個seg. fault 我知道是在free()的時候爆炸
問題1.為什麼會有這樣子的差異 (16.04下不會有問題 18.04就會出現seg. fault)
問題2.在這個\0一定要存在的情況下要如何不讓execvp讀取到這個null參數 可以正常的
執行
餵入的資料(Input):
ls
預期的正確結果(Expected Output):
正確的列出ls的結果
錯誤結果(Wrong Output):
ls: cannot access '': No such file or directory
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
補充說明(Supplement):
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.105.238.216
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1537526692.A.A0E.html
→ dododavid006: execvp 要的是以 NULL 指標結尾的字串陣列 你這樣寫09/21 19:05
→ dododavid006: 是個 "\0" 字串09/21 19:05
一語驚醒夢中人 改成等於null可以了 感謝
已解決
※ 編輯: achicn3 (112.105.238.216), 09/21/2018 19:21:17