[英]When assert() fails, what is the program exit code?
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.