2011-11-10 82 views
10

我有一個C程序,它返回一個整數值。我很驚訝地發現,從shell提示符檢查返回值時,我得到的值模256Linux/bash中程序返回值的有效範圍是什麼?

/* prog.c */ 
int main(...) { return 257; } 

-

> ./prog.e 
> echo $? 
1 
  • 爲什麼我不能看到整個整數?
  • 此行爲記錄在哪裏?
  • 我怎樣才能得到整個32位值的殼?
+3

返回值根據定義的錯誤代碼。您不能使用返回值來傳遞某些其他數值,它必須用於指示成功(0)或錯誤(非零)。如果您的意圖是在*成功執行期間輸出某種計數或其他非零數值,則必須將其寫入STDOUT。 – meagar

+0

謝謝,@meagar。我需要將它作爲我工作的一些非生產代碼的暫時黑客來驗證我的嵌入式代碼開發。我明白你提到的警告,但是,它並沒有回答我的問題。 – ysap

+0

這就是爲什麼它是評論,而不是答案。評論不是*應該*回答問題。暫時的黑客攻擊或其他方式,你將無法確定你要返回的號碼。你將不得不將它輸出到STDOUT。 – meagar

回答

1

返回狀態在wait和相關的系統調用中被解釋(排序)。

基本上:

WEXITSTATUS(stat_val)
如果WIFEXITED(stat_val)的值是非零,則該宏計算結果爲低階狀態的論點,即8位子進程傳遞給_exit()或退出(),或子進程從main()返回的值。

所以它只限於8位。你不能移植得更多。 (我不知道依賴於系統的方法,以獲得更多的要麼。)

3

的解釋是正確的在man exit頂部:

 
    The exit() function causes normal process termination and the value of 
    status & 0377 is returned to the parent (see wait(2)). 

換句話說,只有最低8位被傳播到父進程。

在這方面,從main()返回退出代碼與將其傳遞到exit()沒有區別。

+0

謝謝。我實際上看過「man bash」頁面,但在那裏找不到。我想我正在做B/C我沒想到看到'exit'頁面。 – ysap