2016-01-20 64 views
5

例如...爲什麼超過255的返回碼在C++中返回不同的數字?

#include <iostream> 

using namespace std; 

int main(){return 300;} 

返回:

Process finished with exit code 44 

+3

它只需要8位。 '300&0xff == 44'。很確定這主要是Unix的事情。請參閱'waitpid'手冊頁中的'WEXITSTATUS' - 狀態被OR'轉換爲其他值。 – asveikau

+0

你能解釋一下爲什麼嗎?是否有可能返回更高的數字? – leszakk

+2

沒有超過255的返回代碼這樣的事情。操作系統忽略了前八位以外的任何位。 – EJP

回答

8

標準知道只有兩個standaradized返回值:EXIT_SUCCESS(或零),並EXIT_- FAILURE

3.6.1/5在主return語句具有離開主功能的效果(破壞任何具有自動存儲持續時間的對象)和 以返回值作爲參數調用std::exit

18.5/8(...)最後,控制返回到主機環境。如果狀態爲零或EXIT_SUCCESS,則會返回狀態爲 的實施定義表單。如果狀態爲EXIT_- FAILURE,則返回的狀態不成功終止的 實現定義形式爲 。 否則返回的狀態是實現定義的

因此不保證任何其他整數按原樣返回。

MS Windows例如GetExitCodeProcess()函數返回整數值,所以你會得到300

POSIX兼容的系統,如Linux,規則是(「只有8個最低顯著位(即狀態& 0377)應可用於等待的父程序「」。所以對於300,它將是44.

+0

實際上,在unix下,退出代碼在MSB中,所以'(status&0xff00)>> 8'。只有8位的原因是歷史性的:在原來的unix [爲PDP-11開發]下,int是16位,所以'wait'中'status'沒有更大的錯誤代碼。爲了向後兼容,錯誤代碼的大小增加了_not_,儘管大多數曲目現在將'int'定義爲32位實體。如前所述,由於程序返回的代碼是通過操作系統並由系統調用的父級獲得的,因此取決於操作系統類型 –

+0

@CraigEstey有趣的是,謝謝!事實上,我在「* unix操作系統的設計*」中找到了一個說明,說明傳遞給'exit()'的低8位存儲在內部進程返回代碼的第8至15位中。我想這就是爲什麼從['wait()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/wait.html)獲得的返回代碼必須用WIFEXITED( )''''WEXITSTATUS()'等等......並且返回['system()'](http://man7.org/linux/man-pages/man3/system.3.html )。 – Christophe

+0

感謝@HansPassant的更新。實際上,'exit()'的Windows文檔中提到「*主機環境可以使用狀態的低位字節*」,但測試顯示總是返回完整整數,完全如您所述'GetExitCodeProcess()'。即使使用傳統的'execlp()'也會發生這種情況。因此,似乎沒有「唯一」一詞被解釋爲「最低字節或更多」:-) – Christophe

相關問題