2010-05-19 60 views

回答

22

C99標準規定,assert電話abortabort東西,指出這對返回代碼:

的狀態實現定義的形式不成功的終止是由函數的方式返回給主機環境呼叫加註(SIGABRT)。

它記錄在c99標準here的7.2.1.1節(斷言)和7.20.4.1(中止)中。

許多UNIX系統將返回128加上信號編號(SIGABRT是信號編號6),因此您可能會得到134.無論您得到什麼,它都應該由C實現記錄。

例如,請參閱gcc的here。儘管對於返回到呼叫環境的內容仍然保持沉默。從特定部分here

有些選擇是由庫和操作系統(或爲獨立環境編譯時的其他環境)進行的;有關詳細信息,請參閱其文檔。

而且here

大部分這些點的行爲依賴於C庫的實現,而不是通過GCC本身定義。

那麼,在程序終止(特別是退出狀態位)glibc的DOCO here。它提到慣例,但沒有堅定的規則。

+0

這是一個很好的答案,而134正是我所得到的。 – 2010-05-19 05:30:57

+0

鏈接到GCC的文檔似乎不包含任何感興趣的內容,也不能找到您所做的報價。 – 2010-05-19 05:35:11

+0

你可能會改變glibc doco鏈接直接指向這裏,除非我錯過了一些東西? http://www.gnu.org/s/libc/manual/html_node/Exit-Status.html#Exit-Status – 2010-05-19 05:35:52

2

它是特定於實現的。你可以這樣做:

int main() 
{ 
    assert(0); 
} 

然後運行它:

> ./a.out 
> echo $? 
1 (<- or whatever) 

這至少會告訴你什麼期望您的設置。我使用gcc和g ++在幾個linux盒子上使用gettitng 134。

+3

您應該始終回答具體參考標準的答案。 – wilhelmtell 2010-05-19 04:04:00

+1

編譯器並不總是遵循T的標準。(我在看你微軟)雖然知道標準所說的內容是很好的,但知道編譯器真正做什麼也是同樣好的。他們應該做的並不總是他們實際做的。這和標準實際上並不是免費的。 – 2013-10-14 04:32:46

-1

我正在與posix消息隊列我有同樣的錯誤mq_open失敗errono 38(ENOSYS)。

工作的重點是在內核配置中啓用POSIX MESSGE QUEUE來重建kenel。

這將建立與POSIX消息隊列支持的內核,它爲我工作。

感謝

+1

我想你的意思是把這個答案放在另一個問題上。 – 2010-05-19 10:25:58

0

我無法找到實際的規範它(POSIX是一種很難搜索),但我沒有找到一個參考。

拋出的斷言導致退出狀態與EXIT_FAILURE擴展爲(reference)的任何狀態相同。由於您正在處理Linux,因此您也正在處理POSIX,它進一步定義了c99中的行爲。