簡體   English   中英

當 assert() 失敗時,程序退出代碼是什么?

[英]When assert() fails, what is the program exit code?

assert()調用失敗時,使用的退出代碼是什么,它記錄在哪里?

C99(在 C11 中未更改)標准聲明assert調用abort並且abort內容說明了有關返回代碼的內容:

狀態不成功終止的實現定義形式通過函數調用raise(SIGABRT)返回到主機環境。

它記錄在 C99 標准的第 7.2.1.1 節(斷言)和 7.20.4.1(中止) here 中

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

例如,請參閱此處了解gcc 盡管它對返回到調用環境的內容保持沉默。 這里的具體部分:

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

在這里

大多數這些點的行為取決於 C 庫的實現,而不是由 GCC 本身定義的。

所以,是glibc DOCO 這里在程序終止(特別是退出狀態位)。 它提到了慣例,但沒有明確的規則。

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

int main()
{
    assert(0);
}

然后運行它:

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

這至少會告訴您對設置的期望。 我在幾個帶有 gcc 和 g++ 的 linux 機器上得到了 134。

我找不到它的實際規范(POSIX 有點難搜索),但我確實找到了參考。

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

我在使用 posix 消息隊列時遇到了同樣的錯誤 mq_open was failed with errno 38 (ENOSYS)。

工作是在內核配置中啟用 POSIX MESSGE QUEUE 的情況下重建內核。

這將構建具有 POSIX 消息隊列支持的內核,它對我有用。

感謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM