2016-04-25 88 views
2

我有一個名爲Test的C++可執行文件。我想在執行完成時找到GetExitCodeProcess()代碼。在bash中獲取進程的退出狀態

我可以寫在另一個包裝程序本身下面找出狀態代碼:

... 
int status = system("./Test"); 

,然後再檢查WIFSIGNALED/WIFSTOPPED等狀態。

然而,不寫封裝程序,我可以通過編寫bash腳本從.Test程序的pid中獲取退出狀態代碼?

編輯: 執行./Test後在bash中寫入'$'是否解決了上述問題?

編輯:摘要是 - 當我從命令行運行可執行文件時,我如何(而不是程序)獲取退出狀態。

+0

您正在使用C++來調用腳本,使用C++來獲取退出狀態 - 不要調用另一個腳本,這樣做的事情太多了。 – SaintHax

回答

3

執行命令/ bash後,您可以簡單地執行echo $?,該命令將輸出程序的退出代碼。

每個命令都會返回退出狀態(有時稱爲返回 狀態或退出代碼)。一個成功的命令返回0,而 不成功返回非零值,通常可將其解釋爲錯誤代碼 。雖然有一些例外情況,但成功完成後,表現良好的UNIX命令,程序和實用程序返回 a 0退出代碼。

echo $? # Non-zero exit status returned -- command failed to execute. 

echo 

exit 113 # Will return 113 to shell. 
      # To verify this, type "echo $?" after script terminates. 

# By convention, an 'exit 0' indicates success, 
#+ while a non-zero exit value means an error or anomalous condition. 

或者,如果你想確定返回碼後臺進程/腳本(啓動與nohup或背景&操作運行),你可以得到進程/腳本的PID開始,等待它的終止,然後獲取退出代碼。

$ ./foo.sh & 
[1] 28992   # Some random number for the process-id 

$ echo $!   # Get process id of the background process 
28992 

$ wait 28992  # Waits until the process determined by the number is complete 

[1]+ Done   ./foo.sh 

$ echo $?   # Prints the return code of the process 
0 

更多信息@http://tldp.org/LDP/abs/html/exit-status.html

+0

我不這麼認爲,b/c系統()已經給他提供了相同的信息$?確實。雖然這個答案已經收到upvotes,但它適用於調用另一個腳本的bash腳本,而不是調用bash腳本的C++程序。從我對OP的理解。 – SaintHax

+0

如果我沒有記錯的話,從OP'然而,不用編寫一個包裝程序,我可以通過編寫一個bash腳本從.Test程序的pid獲取退出狀態代碼?'這基本上是bash腳本調用另一個腳本。如果發現無關緊要,在這種情況下不行,我可以刪除帖子。 – Inian

1

您已接近此wrong--系統()已經返回存在狀態:失敗零成功,非零。可能發生的情況是您的「測試」腳本寫入不正確,或者您正在錯誤地測試「狀態」。我已經看到了開發人員的以下腳本錯誤。

run_some_java 
echo "Done" 

他們從來沒有跟蹤退出代碼,該腳本返回echo命令的最後退出代碼。這使得它總是成功的。這裏有兩種正確退出的方式(我知道其他編碼器的事情有些更先進的方式比第一種更好,但我不認爲這就是這個線程的意思)。爬行,然後走,然後跑。

如果您需要退出狀態,但希望執行所有shell命令。

return_code=0 

mv $letters $ARCHIVE 
return_code=$(($return_code + $?)) 

mv $letters $ARCHIVE 
return_code=$(($return_code + $?)) 

exit $return_code 

如果你想退出的失敗,有set -e尋找到了,這裏是另一種方式。

mv $letters $ARCHIVE || exit 1 
mv $letters $ARCHIVE || exit 2 
相關問題