[問題] system return value

看板C_and_CPP (C/C++)作者 (卡卡獸)時間9年前 (2016/11/09 18:57), 9年前編輯推噓1(1016)
留言17則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) gcc / g++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) no 問題(Question): 一些原因,我必須取得某個執行檔的 return code, 即 echo $? 之值 但就是不想用 echo $? 去 pipe。 我查過了 cplusepluse.com 對 system 之說明,沒 意會錯的話應是說若呼叫該 command 失敗傳回 -1; 呼叫成功的話會是該 exe / library 之傳回值, 也就是 main 的傳回值。於是我寫了二份 code 做測試 /// code 1 : test.cpp int main(int argc, char **argv) { return argc; } /// code 2 : test2.cpp #include <cstdio> #include <cstdlib> int main(int argc, char ** argv) { printf("%d\n", system(".....ERRORCMD....")); printf("%d\n", system("./test")); printf("%d\n", system("./test 1")); printf("%d\n", system("./test 1 2")); return 0; } /// result 32512 256 512 768 這幾個數值看起來是用 bitwise 代表 status, 但和我預期傳回的 -1 1 2 3 有很大的落差 ,請問我是不是誤會什麼了?問題主要二個 (1) 不用 pipe 如何取得另一個執行檔之 return value ? (2) 請問 system 之 return value 意義為何 ??- 先謝謝各位的不吝解惑。 -- 就算把新鮮的肝拿回去,還是一樣寫碼到禿頭,加班到天亮, 永遠當老闆的傀儡 你是不是想這麼做? 是的話你就拿回去~ 拿啊!! 九世宅男 : 下輩子不要再讓我幹工程師了 ~ < Kuso 星爺語錄 > -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.251.92.140 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1478689043.A.86D.html ※ 編輯: EdisonX (60.251.92.140), 11/09/2016 18:59:15

11/09 19:11, , 1F
不要用 system(),使用 vfork() + exec()
11/09 19:11, 1F

11/09 19:12, , 2F
然後使用 wait() 或 waitpid() 就可以取得return status
11/09 19:12, 2F

11/09 19:13, , 3F
system 會去呼叫 shell 再叫 shell 執行你的指令
11/09 19:13, 3F

11/09 19:14, , 4F
The value returned is -1 on error (e.g., fork(2)
11/09 19:14, 4F

11/09 19:14, , 5F
and the return status of the command otherwise.
11/09 19:14, 5F

11/09 19:15, , 6F
This latter return status is in the format specified
11/09 19:15, 6F

11/09 19:15, , 7F
in wait(2). Thus the exit code of the command will be
11/09 19:15, 7F

11/09 19:15, , 8F
WEXITSTATUS(status).
11/09 19:15, 8F

11/09 19:19, , 9F
argc不就是argv的數量,回傳?
11/09 19:19, 9F

11/09 19:25, , 10F
goo.gl/GT3OIo
11/09 19:25, 10F

11/09 19:25, , 11F
啊啊我看懂你的問題了,你要的值要用 WEXITSTATUS() 去取
11/09 19:25, 11F

11/10 00:19, , 12F
疑!所以我沒意會錯推文意思的話,就變成
11/10 00:19, 12F

11/10 00:19, , 13F
WEXITSTATUS( system(pszCmd) ) ; 了嗎 ??
11/10 00:19, 13F

11/10 01:00, , 14F
話是不錯,但你這個寫程式的習慣很不好
11/10 01:00, 14F

11/10 01:01, , 15F
把 status 先存到變數裡比較清楚,而且你有可能需要
11/10 01:01, 15F

11/10 01:02, , 16F
不只一個判斷或取值
11/10 01:02, 16F

11/10 01:50, , 17F
了解!謝謝各位的解答,感謝!!
11/10 01:50, 17F
文章代碼(AID): #1O8m4JXj (C_and_CPP)
文章代碼(AID): #1O8m4JXj (C_and_CPP)